python *和**的打包和解包

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

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

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

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

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

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

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

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

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

举例:

 

(二)解包知识扩展

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

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

列表解包

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

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

1.

元组解包:

字符串解包:

字典解包:

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

2.

多变量赋值操作,例如:

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

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

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值