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

Python 为什么.format(function())不起作用,但%打印值?,python,python-3.x,string-formatting,Python,Python 3.x,String Formatting,我写的代码: 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("

我写的代码:

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 它工作正常,产生:

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
使用
*ball(100)
解包返回值
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