为什么 .format(function()) 不起作用,但 % 打印值?

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() returns 一个元组,就 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)))

我在这里使用了显式编号来表示只需要一个参数,位置 00[0] 取元组的第一个元素,0[1] 取第二个元素。

你的格式字符串需要两个参数给.format,但你只提供了一个(这是一个双元素元组,但它仍然是one 参数)。 另一方面,% operator 需要 一个单独的元组作为它的右手参数,所以没问题。您可以使用前缀星号运算符解压缩您的元组:

b = ball(100)
print("py ball: {}, u ball: {}".format(*b))

ball() 的 return 值是单个值 - 元组。

当您调用 "...".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