Сегодня я столкнулся с этим вопросом, и я придумал другое решение. Если вы беспокоитесь о том, как это выглядит при печати, вы можете заменить стандартный файл stdout на пользовательский, который при вызове write() ищет любые вещи, которые выглядят как float, и заменяет их собственным форматом для их.
class ProcessedFile(object):
def __init__(self, parent, func):
"""Wraps 'parent', which should be a file-like object,
so that calls to our write transforms the passed-in
string with func, and then writes it with the parent."""
self.parent = parent
self.func = func
def write(self, str):
"""Applies self.func to the passed in string and calls
the parent to write the result."""
return self.parent.write(self.func(str))
def writelines(self, text):
"""Just calls the write() method multiple times."""
for s in sequence_of_strings:
self.write(s)
def __getattr__(self, key):
"""Default to the parent for any other methods."""
return getattr(self.parent, key)
if __name__ == "__main__":
import re
import sys
#Define a function that recognises float-like strings, converts them
#to floats, and then replaces them with 1.2e formatted strings.
pattern = re.compile(r"\b\d+\.\d*\b")
def reformat_float(input):
return re.subn(pattern, lambda match: ("{:1.2e}".format(float(match.group()))), input)[0]
#Use this function with the above class to transform sys.stdout.
#You could write a context manager for this.
sys.stdout = ProcessedFile(sys.stdout, reformat_float)
print -1.23456
# -1.23e+00
print [1.23456] * 6
# [1.23e+00, 1.23e+00, 1.23e+00, 1.23e+00, 1.23e+00, 1.23e+00]
print "The speed of light is 299792458.0 m/s."
# The speed of light is 3.00e+08 m/s.
sys.stdout = sys.stdout.parent
print "Back to our normal formatting: 1.23456"
# Back to our normal formatting: 1.23456
Это не хорошо, если вы просто положить числа в строку, но в конце концов, вы, вероятно, хотите, чтобы написать эту строку в какой-то файл где-нибудь, и вы можете быть в состоянии обернуть этот файл с выше объекта. Очевидно, что накладные расходы немного.
Ярмарка предупреждения: я не тестировал это в Python 3, я понятия не имею, будет ли это работать.
Проблема в том, что я плаваю внутри списков, и когда я печатаю (список), я не контролирую это. (Это относится и к другим объектам, кстати). Изменение исходного кода возможно, так как я знаю C, но не совсем то, о чем я думал. Благодарю. – AkiRoss
@AkiRoss: Итак, то, что вы хотите исправить, это список, а не поплавки ... –
@AkiRoss, если вы хотите большего контроля, просто распечатайте элементы отдельно. –