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

2024-06-30 15:41:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我写的代码:

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

Tags: 代码pyformatmostreturndefcallfile
3条回答

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

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)))

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

格式字符串需要两个.format参数,但只提供一个(这是一个两元素元组,但仍然是一个参数)。 另一方面,%操作符需要一个元组作为它的右参数,因此是可以的。您可以使用前缀星号运算符解压缩元组:

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

相关问题 更多 >