[英]Why does .format(function()) not work, but % prints the value?
我写的代码:
def ball(f):
py_ball = f * 5
u_ball = py_ball / 10
return py_ball, u_ball
print("py ball: {}, u ball: {}".format(ball(100)))
当我使用str.format
,它会抛出异常:
Traceback (most recent call last): File "rear.py", line 5, in print("py ball: {}, u ball: {}".format(ball(100))) IndexError: tuple index out of range
但如果我使用%
格式:
print("py ball: %d, u ball: %d" % ball(100))
它工作正常并产生:
py ball: 500, u ball: 50
str.format()
为每个插槽采用单独的参数 ,而%
接受元组或单个值。 ball()
返回一个元组,就str.format()
而言,这是一个单独的参数。 由于您的模板有2个插槽,因此第二个插槽缺少一个参数。
您有两个选择:接受.format()
的单个参数,并使用格式化指令来提取嵌套元素,或者将元组作为单独的参数传递。
后者可以使用*expr
调用表示法完成:
print("py ball: {}, u ball: {}".format(*ball(100)))
但格式规范还允许您解决元组元素:
print("py ball: {0[0]}, u ball: {0[1]}".format(ball(100)))
我在这里使用显式编号来表示在位置0
中只需要一个参数; 0[0]
取元组的第一个元素, 0[1]
取第二个元素。
您的格式字符串需要两个 .format
参数,但您只提供一个(这是一个双元素元组,但它仍然是一个参数)。 另一方面, %
运算符需要一个元组作为其右手参数,所以没关系。 您可以使用前缀星号运算符解压缩您的元组:
b = ball(100)
print("py ball: {}, u ball: {}".format(*b))
ball()
的返回值是单个值 - 元组。
当您调用"...".format(ball(100))
您将该单个值传递给最终需要两个值的函数。
当你调用"..." % ball(100)
你要向%
运算符提供一个元组,它需要一个元组!
毫不奇怪,它适用于第二种情况,并在第一种情况下失败。
尝试使用splat运算符将元组展平为调用.format
的参数,或者尝试自己扩展元组,或尝试在.format
调用中使用命名参数访问:
ball100 = ball(100)
"py ball: {}, u ball: {}".format(*ball100) # splat! Flatten the tuple
"py ball: {}, u ball: {}".format(ball100[0], ball100[1]) # DIY
"py ball: {ball[0]}, u ball: {ball[1]}".format(ball=ball100) # named arg
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.