Python允许函数从调用语句中收集任意数量的实参。例如下面自定义函数制作一个披萨,它需要接受很多配料,但无法预先确定顾客要点多少种配料。
下面行数只有一个形参*toppings,不管调用语句提供多少个实参,这个参数都会收集到:
形参名*toppings中的*号让Python创建一个名为toppings的元组,该元组包含函数收到的所有的值,在函数体内可以使用toppings元组,从而实现接受任意数量的实参。
(1)结合使用位置参数和任意数量的实参
Python允许函数接受不同类型的实参,位置实参和任意数量实参结合使用,但是任意数量实参的形参比如放在其它位置形参的最后。参考如下代码可以更好理解:
注意:经常看到通用的形参名*args,它就是如上收集任意数量的位置实参。
(2)任意数量的关键字实参
有时候,函数需要接收任意数量的实参,但预先不知道传递给函数的会是什么样的信息。在这种情况下,Python允许函数编写称能够接收任意数量的键值对——调用语句提供多少就接收多少。
下面代码定义的bulid_profile()函数创建一个用户简介,不仅接收名和姓,还接收任意数量的关键字实参:
Python定义函数,形参**user_info中的两个**,将创建一个名为user_info的字典,该字典包含收到的其它所有名值对。我们调用build_profile()函数,向它传递姓名('liuzx')、年龄(18),以及两个键值对(家庭住址='黄河路77号',学历='博士')。函数产生一个类型为字典的实参,实参变量名为user_info,里面收集了调用时传入的键值对(家庭住址='黄河路77号',学历='博士'),并在函数体内,增加两个键值对('姓名'='liuzx','年龄'=18),函数最后把user_info 字典变量作为函数的返回值。
注意:在Pyhton中,经常可以看到**kwargs,它常用于收集任意数量的关键值实参。
在编写函数时,Python还允许混合位置实参,任意数量的实参、任意数量的关键字实参,样式如下:
def function_name(name,age,*args,**kwargs):
'''
位值形参:name,age
任意数量实参:args(元组)
任意数量关键字实参:kwargs(字典)
'''
pass