(一)*和**的打包和解包
python中的*和**,能够让函数支持任意数量的参数。它们在函数定义中用来打包参数,在函数调用中用来解包参数。
一个星号*可作用于所有的可迭代对象,称为迭代器解包操作,作为位置参数传递给函数。两个星号**只能作用于字典对象,称之为字典解包操作,作为关键字参数传递给函数。使用 *和 ** 的解包的好处是能节省代码量,使得代码看起来更优雅。
一. 在函数定义中,打包参数
1. * 的作用:在函数定义中,收集所有的位置参数到一个新的元组,并将这个元组赋值给变量args
2. ** 的作用:在函数定义中,收集关键字参数传递给一个字典,并将这个字典赋值给变量kwargs
二. 在函数调用中,解包参数
1. * 的作用:在函数调用中,* 能够将元组或者列表解包成不同的参数
2. ** 的作用:在函数调用中,**会以键/值的形式解包一个字典,使其成为独立的关键字参数
举例:
(二)解包知识扩展
解包就是将容器里面的元素逐个取出来放在其它地方,好比你老婆去菜市场买了一袋苹果回来分别发给家里的每个成员,这个过程就是解包。
Python 中的解包是自动完成的,例如:
列表解包
如果列表中有3个元素,那么刚好可以分配给3个变量。
除了列表对象可以解包之外,任何可迭代对象都支持解包,可迭代对象包括元组、字典、集合、字符串、生成器等实现了__next__方法的一切对象:
1.
元组解包:
字符串解包:
字典解包:
可见,字典解包后,只会把字典的 key 取出来,value 则丢掉了。
2.
多变量赋值操作,例如:
本质上也是自动解包过程,等号右边其实是一个元组对象 (1, 2,3) 。
有时候我们代码不小心多了一个逗号,就变成了元组对象:
在 Python 中,交换两个变量非常方便,本质上也是自动解包过程:
此外,等号左边变量的个数不等于右边可迭代对象中元素的个数,也是允许解包的:
以上是表达式解包的一些操作,接下来介绍函数调用时的解包操作。函数调用时,有时你可能会用到两个符号:星号*和 双星号** 。
从 python3.5 开始,在函数调用中,可以有任意多个解包操作,例如: