(一)*和**的打包和解包

python中的*和**,能够让函数支持任意数量的参数。它们在函数定义中用来打包参数,在函数调用中用来解包参数。

一个星号*可作用于所有的可迭代对象,称为迭代器解包操作,作为位置参数传递给函数。两个星号**只能作用于字典对象,称之为字典解包操作,作为关键字参数传递给函数。使用 *和 ** 的解包的好处是能节省代码量,使得代码看起来更优雅。

一. 在函数定义中,打包参数

1.  * 的作用:在函数定义中,收集所有的位置参数到一个新的元组,并将这个元组赋值给变量args

python拆包解包代码 python打包解包_python拆包解包代码

2.  ** 的作用:在函数定义中,收集关键字参数传递给一个字典,并将这个字典赋值给变量kwargs

python拆包解包代码 python打包解包_python拆包解包代码_02

二. 在函数调用中,解包参数

1.   * 的作用:在函数调用中,* 能够将元组或者列表解包成不同的参数

python拆包解包代码 python打包解包_元组_03

python拆包解包代码 python打包解包_python拆包解包代码_04

2.  ** 的作用:在函数调用中,**会以键/值的形式解包一个字典,使其成为独立的关键字参数

python拆包解包代码 python打包解包_python拆包解包代码_05

举例:

python拆包解包代码 python打包解包_函数调用_06

 

(二)解包知识扩展

解包就是将容器里面的元素逐个取出来放在其它地方,好比你老婆去菜市场买了一袋苹果回来分别发给家里的每个成员,这个过程就是解包。

Python 中的解包是自动完成的,例如:

列表解包

python拆包解包代码 python打包解包_python拆包解包代码_07

如果列表中有3个元素,那么刚好可以分配给3个变量。

除了列表对象可以解包之外,任何可迭代对象都支持解包,可迭代对象包括元组、字典、集合、字符串、生成器等实现了__next__方法的一切对象:

1.

元组解包:

python拆包解包代码 python打包解包_解包_08

字符串解包:

python拆包解包代码 python打包解包_元组_09

字典解包:

python拆包解包代码 python打包解包_python拆包解包代码_10

可见,字典解包后,只会把字典的 key 取出来,value 则丢掉了。

2.

多变量赋值操作,例如:

python拆包解包代码 python打包解包_python拆包解包代码_11

本质上也是自动解包过程,等号右边其实是一个元组对象 (1,  2,3)  。

有时候我们代码不小心多了一个逗号,就变成了元组对象:

python拆包解包代码 python打包解包_python拆包解包代码_12

在 Python 中,交换两个变量非常方便,本质上也是自动解包过程:

python拆包解包代码 python打包解包_函数调用_13

此外,等号左边变量的个数不等于右边可迭代对象中元素的个数,也是允许解包的:

python拆包解包代码 python打包解包_元组_14

以上是表达式解包的一些操作,接下来介绍函数调用时的解包操作。函数调用时,有时你可能会用到两个符号:星号*和 双星号**  。

python拆包解包代码 python打包解包_解包_15

从 python3.5 开始,在函数调用中,可以有任意多个解包操作,例如:

python拆包解包代码 python打包解包_函数调用_16