Python函数参数的封包与拆包
当自定义函数有大量参数或者参数数量不定时,可以使用参数封包;当调用的函数有大量参数或者参数数量不定时,可以使用参数拆包。
1 函数参数的封包
在《Python自定义函数的位置参数和关键字参数》中提到,python函数的参数主要分为位置参数和关键字参数。针对这两种不同类型的参数,封包的方式不同。
1.1 位置参数的封包
在函数定义中,* 会把调用时传入的所有未匹配的位置参数封装打包成一个元组。代码如图1所示。
图1 使用*封包参数的代码
其中,第1-4行代码定义了函数f(),该函数的第三个参数*args表示将第3个参数到最后一个参数,封装打包到元组args中。第6行代码调用自定义函数f()。代码运行的效果如图2所示。
图2 代码运行效果
1.2 关键字参数的封包
** 会把调用时传入的所有未匹配的关键字参数打包成一个字典。代码如图3所示。
图3 使用**封包参数的代码
其中,第1-4行代码定义了函数f(),该函数的第三个参数**kwargs表示将第3个参数到最后一个参数,封装打包到字典kwargs中。第6行代码调用自定义函数f()。代码运行的效果如图4所示。
图4 代码运行效果
注意1 在定义包含打包参数的函数时,打包参数必须位于在参数列表中的最后。
2 函数参数的拆包
2.1 位置参数的拆包
在函数调用时,* 可以把一个列表、元组等可迭代对象拆解成独立的位置参数。代码如图5所示。
图5 使用*拆包列表/元组的代码
其中,第1-2行代码自定义的函数f(),有三个独立的参数。第6行调用该参数时,将数组nums前面加上*,实现参数的拆包。代码运行效果如图6所示。
图6 代码运行效果
注意2 拆包列表或元组时,其元素个数,必须与函数参数的个数相等。
2.2 关键字参数的拆包
** 可以把一个字典拆解成关键字参数。代码如图7所示。
图7 使用**拆包字典的代码
代码运行效果与图6相同。
注意3 拆包字典时,其元素个数必须与参数的个数相同,并且字典每个元素的键值要和参数名对应相同。
注意4 *args 和 **kwargs 只是约定俗成的名称,星号后面的变量名可以任意(如 *items, **options),但推荐使用 args 和 kwargs。
