为什么我不能使用元组作为新样式格式化的参数(“string”.format())?它在旧样式中工作正常(“string”%)?
此代码有效:
>>> tuple = (500000, 500, 5)
... print "First item: %d, second item: %d and third item: %d." % tuple
First item: 500000, second item: 500 and third item: 5.
这不是:
>>> tuple = (500000, 500, 5)
... print("First item: {:d}, second item: {:d} and third item: {:d}."
... .format(tuple))
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
ValueError: Unknown format code 'd' for object of type 'str'
即使使用{!r}
>>> tuple = (500000, 500, 5)
... print("First item: {!r}, second item: {!r} and third item: {!r}."
... .format(tuple))
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
IndexError: tuple index out of range
虽然它可以这样工作:
>>> print("First item: {!r}, second item: {!r} and third item: {!r}."
... .format(500000, 500, 50))
First item: 500000, second item: 500 and third item: 5.
答案 0 :(得分:49)
旧的格式化方法使用了二元运算符%
。就其性质而言,它只能接受两个论点。新的格式化方法使用方法。方法可以采用任意数量的参数。
因为你有时需要传递多个东西进行格式化,并且一直都有一个项目创建元组有些笨拙,旧式的方式出现了一个hack:如果你把它作为一个元组传递,它将使用作为要格式化的东西的元组的内容。如果你传递的不是元组,它将使用它作为格式化的唯一东西。
新方法不需要这样的黑客:因为它是一种方法,它可以采用任意数量的参数。因此,需要将多个要格式化的内容作为单独的参数传递。幸运的是,您可以使用*
:
print("First item: {:d}, second item: {:d} and third item: {:d}.".format(*tuple))
答案 1 :(得分:18)
正如icktoofay解释的那样,在旧的格式化方式中,如果你传入一个元组,Python会自动解压缩它。
但是,您不能使用str.format
方法的元组,因为Python认为您只传入一个参数。您必须使用*
运算符解压缩元组,以将每个元素作为单独的参数传递。
>>> t = (500000, 500, 5)
>>> "First item: {:d}, second item: {:d} and third item: {:d}.".format(*t)
First item: 500000, second item: 500 and third item: 5.
另外,您会注意到我将tuple
变量重命名为t
- 不要对变量使用内置名称,因为您将覆盖它们,这可能会导致问题进入轨道。
答案 2 :(得分:1)
如果手动索引大括号内的元组,实际上可以使用元组作为format()
的参数:
>>> t = (500000, 500, 5)
>>> print("First item: {0[0]:d}, second item: {0[1]:d} and third item: {0[2]:d}.".format(t))
First item: 500000, second item: 500 and third item: 5.
我发现这不如*
方法那么明确。