Я работаю со сценарием Python, который печатает множество чисел с плавающей запятой. В каждой команде print
я использую round(x, 3)
для округления напечатанного числа x
до 3 знаков после запятой перед печатью. Вот упрощенный пример:
x1 = 1.61803398875
print('x1 = ' + str(round(x1, 3))) # x1 = 1.618
x2 = x1**2
print('x2 = ' + str(round(x2, 3))) # x2 = 2.618
x3 = 1/(x2-1)
print('x3 = ' + str(round(x3, 3))) # x3 = 0.618
Фактический код содержит сотни таких команд печати. Есть ли более эффективный способ выполнить часть округления этого сценария? Например, существует ли единая всеобъемлющая команда, которая будет округлять все печатаемые числа с плавающей запятой до заданной точности, как это делается для переменных numpy
и pandas
?
Я ищу решение, которое не требует перемещения или объединения команд print
или преобразования напечатанных переменных в переменные numpy
и pandas
перед печатью.
Используйте f-строку с форматированием.
не могли бы вы написать еще одну функцию и вызвать ее?
Я не думаю, что есть какой-либо способ настроить форматирование чисел по умолчанию.
вы можете перезаписать встроенные функции в Monkeypatch Print, но я не знаю, если стоит
print(f'x1 = {x1:.3f}') # x1 = 1.618
писать, по крайней мере, намного проще, чем str(round(...))
, по моему мнению, но я не уверен, что это поможет вам достичь желаемого.
Использование f-строк — гораздо более простой способ указать округление в строковых представлениях чисел:
x1 = 1.61803398875
print(f'x1 = {x1:.3f}') # x1 = 1.618
x2 = x1**2
print(f'x2 = {x2:.3f}') # x2 = 2.618
x3 = 1/(x2-1)
print(f'x3 = {x3:.3f}') # x3 = 0.618
но вам все равно придется каждый раз повторять часть .3f
.
Если вы хотите СУХАТЬ как можно больше, вы можете написать обертку:
def print_var(var: str, val: float) -> None:
print(f'{var} = {val:.3f}')
x1 = 1.61803398875
print_var('x1', x1) # x1 = 1.618
x2 = x1**2
print_var('x2', x2) # x2 = 2.618
x3 = 1/(x2-1)
print_var('x3', x3) # x3 = 0.618
или вы можете переопределить print
(лично я бы не рекомендовал это):
import builtins
def print(*args, **kwargs):
rounded_args = [
f'{arg:.3f}' if isinstance(arg, float) else arg
for arg in args
]
builtins.print(*rounded_args, **kwargs)
x1 = 1.61803398875
print('x1 = ', x1) # x1 = 1.618
x2 = x1**2
print('x2 = ', x2) # x2 = 2.618
x3 = 1/(x2-1)
print('x3 = ', x3) # x3 = 0.618
Учитывая количество повторений, почему бы просто не написать для этого функцию printRounded(x)?