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