4.11 不定长参数列表

具有不定长参数列表的函数(如内置函数minmax)可以接收任意数量的参数。例如下面的代码中min函数的调用:

min的说明文档指出min有两个必需的参数(名为arg1arg2)和一个可选的形如*args的参数,表明函数可以接收任意数量的附加参数。参数名称之前的*告诉Python将剩余的参数打包成元组传递给参数args。在上面的调用中,参数arg1接收88,参数arg2接收75,参数args接收元组(96,55,83)

定义带不定长参数列表的函数

下面的代码定义了average函数,它可以接收任意个数的参数:

依照惯例,上面的代码将参数命名为args,但这并不是强制性的,可以使用任意标识符。如果函数包含多个参数,那么*args参数必须是最右端的一个参数。

下面的代码使用不同长度的参数列表调用几次average函数:

为了计算平均值,用args元组中元素的总和(内置函数sum的返回值)除以元素的个数(内置函数len的返回值)。观察average函数的定义可以知道,如果args的长度为0,会引发ZeroDivisionError。本书会在下一章演示如何在没有解包的情况下访问元组中的元素。

将可迭代对象的单个元素作为函数的参数

可以解包元组、列表或者其他可迭代对象,并将解包得到的元素作为参数单个传递给函数。在调用函数时将操作符*作用于可迭代参数可以对该参数解包。下面的代码创建了一个包含5个元素的列表grades,然后使用表达式*grades对其解包,所得元素作为average函数的参数:

上面的代码中的函数调用形式相当于average(88, 75, 96, 55, 83)