是否可以在Python中的format()函数的格式说明符中使用变量?我有以下代码,我需要 VAR 等于 field_size:
def pretty_printer(*numbers):
str_list = [str(num).lstrip('0') for num in numbers]
field_size = max([len(string) for string in str_list])
i = 1
for num in numbers:
print("Number", i, ":", format(num, 'VAR.2f')) # VAR needs to equal field_size
str.format()
方法,它可以让您插入其他变量,例如宽度:
'Number {i}: {num:{field_size}.2f}'.format(i=i, num=num, field_size=field_size)
每个
{}
都是一个占位符,填充关键字参数中的命名值(您也可以使用编号位置参数)。可选 :
之后的部分给出了格式(基本上是 format()
函数的第二个参数),您可以使用更多 {}
占位符来填充参数。
使用编号位置将如下所示:
'Number {0}: {1:{2}.2f}'.format(i, num, field_size)
但您也可以混合两者或选择不同的名称:
'Number {0}: {1:{width}.2f}'.format(i, num, width=field_size)
如果省略数字和名称,字段会自动编号,因此以下格式与前面的格式等效:
'Number {}: {:{width}.2f}'.format(i, num, width=field_size)
请注意,整个字符串是一个模板,因此像
Number
字符串和冒号这样的东西都是模板的一部分。
但是,您需要考虑到字段大小包括小数点;您可能需要调整大小以添加这 3 个额外字符。
演示:
>>> i = 3
>>> num = 25
>>> field_size = 7
>>> 'Number {i}: {num:{field_size}.2f}'.format(i=i, num=num, field_size=field_size)
'Number 3: 25.00'
最后但并非最不重要的一点是,在 Python 3.6 及更高版本中,您可以使用 格式化字符串文字:
将变量直接放入字符串文字中f'Number {i}: {num:{field_size}.2f}'
使用常规字符串模板和
str.format()
的优点是您可以交换模板,f 字符串的优点是可以在字符串值语法本身中实现非常可读且紧凑的内联字符串格式。
我更喜欢这个(新3.6)风格:
name = 'Eugene'
f'Hello, {name}!'
或多行字符串:
f'''
Hello,
{name}!!!
{a_number_to_format:.1f}
'''
这真的很方便。
我发现旧式格式有时难以阅读。甚至串联也可以更具可读性。看一个例子:
'{} {} {} {} which one is which??? {} {} {}'.format('1', '2', '3', '4', '5', '6', '7')
我刚刚将 VAR 值分配给 field_size 并更改了打印语句。它有效。
def pretty_printer(*numbers):
str_list = [str(num).lstrip('0') for num in numbers]
field_size = max([len(string) for string in str_list])
VAR=field_size
i = 1
for num in numbers:
print("Number", i, ":", format(num, f'{VAR}.2f'))
现在我们已经到了 python 3.12,双重嵌套的 f 字符串也能做到这一点,而且非常紧凑:
r = 1.0234
fc = ".3f"
print(f"r = {r:{fc}}")
输出
r = 1.023