#python #string
Вопрос:
В python я могу создать следующую функцию:
In [1]: num_formatter = '{:.4g}'.format
In [2]: num_formatter(1.234567)
Out[2]: '1.235'
Но сейчас я хочу чего-то вроде:
In [1]: num_fig = 4
In [2]: num_formatter = '{:.{nf}g}'.format(nf=num_fig)
In [3]: num_formatter(1.234567)
Out[3]: '1.235'
Однако этот код выдает мне ошибку «Индекс замены 0 вне диапазона для кортежа позиционных аргументов». Что я понимаю, он спрашивает, что делать с вводом 1.234567, но я не знаю, как это исправить. Я попытался использовать *args или **kargs внутри формата, но это не работает. Как бы это было сделано?
Комментарии:
1. Превратить его в функцию или в лямбду?
2. Или используйте
functools.partial
.
Ответ №1:
Использование f
строки
Экс:
nf = 4
num_formatter = f'{{:.{nf}g}}'.format
print(num_formatter(1.234567)) # --> 1.235
Ответ №2:
Используйте лямбду:
>>> num_formatter = lambda n,p: f'{n:.{p}g}'
>>> num_formatter(1.234567,4)
'1.235'
Другой вариант-создать настраиваемый класс, который является лучшим вариантом, чем глобальные переменные:
>>> class Formatter:
... def __init__(self,precision=None):
... self.set_precision(2 if precision is None else precision)
... def __call__(self,n):
... return f'{n:.{self.p}g}'
... def set_precision(self,p):
... self.p = p
...
>>> num_formatter = Formatter()
>>> num_formatter(1.23456)
'1.2'
>>> num_formatter.set_precision(4)
>>> num_formatter(1.23456)
'1.235'
>>> num_formatter = Formatter(3)
>>> num_formatter(1.23456)
'1.23'