python *和**的打包和解包

  • Post author:
  • Post category:python



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

python中的*和**,能够让函数

支持任意数量

的参数。它们在

函数定义中用来打包

参数,在

函数调用中用来解包

参数。


一个星号*可作用于所有的可迭代对象

,称为迭代器解包操作,作为位置参数传递给函数。

两个星号**只能作用于字典对象

,称之为字典解包操作,作为关键字参数传递给函数。使用 *和 ** 的解包的好处是能节省代码量,使得代码看起来更优雅。


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

1.  * 的作用:在函数定义中,收集所有的位置参数到一个新的

元组

,并将这个元组赋值给变量args

2.  ** 的作用:在函数定义中,收集关键字参数传递给一个

字典

,并将这个字典赋值给变量kwargs


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

1.   * 的作用:在函数调用中,* 能够将

元组或者列表

解包成不同的参数

2.  ** 的作用:在函数调用中,**会以键/值的形式

解包一个字典

,使其成为独立的关键字参数

举例:


(二)解包知识扩展

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

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

列表解包

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

除了列表对象可以解包之外,

任何可迭代对象都支持解包

,可迭代对象包括元组、字典、集合、字符串、生成器等

实现了__next__方法的一切对象:

1.

元组解包:

字符串解包:

字典解包:

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

2.

多变量赋值操作,例如:

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

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

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

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

以上是

表达式解包

的一些操作,接下来

介绍函数调用

时的解包操作。函数调用时,有时你可能会用到两个符号:星号*和 双星号**  。

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



版权声明:本文为qq_39938666原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。