Python中*
和**
是两个非常有趣的操作符,*
对应列表或元祖,**
则对应字典,主要有以两类功能。
- 在函数参数或赋值中接受不确定数量的位置参数和关键字参数。
位置参数指按顺序传入的参数,如
add(1,2,3)
, 关键字参数指以键值对传入的参数如add(a=1,b=2,c=3)
def func(*args, **kwargs):
print("args接收所有位置参数并得到一个元祖变量", type(args), args)
print("kwargs接收所有的关键字参数并得到一个字典", type(kwargs), kwargs)
func(1, 2, 3, a=4, b=5, c=6)
在函数中使用*args和**kwargs可以使得函数可以接受任意数量的位置参数和关键词参数。
- 在变量赋值中
*
同样可用于保留或抛弃任意数量的参数,示例如下
a, *_, c = [1,2, 3,4,5,6]
print(a, c)
print(_, type(_))
_
也算一个变量,一般我不需要使用的变量可用_
表示,*_
则可以接收第一个和最后一个之外的任意多个变量,结果是个元祖。
3. 列表元祖和字典拆包
如果我们定义l = [1,2,3]
那么l
是1个列表变量,如果我们需要里面的3个值1,2,3
,就可以使用*l
将其拆开。
l
: 1个变量, 列表变量*l
:3个值
如我们有个函数如下:
def add(a,b,c):
print(a+b+c)
怎么样能把l中的3个数据不通过索引直接传入函数呢?就可以想下面一样解包直接传入
l = [1,2,3]
def add(a,b,c):
print(a+b+c)
add(*l) # *l 就相当于add(1,2,3)
字典的拆包使用**
,即把一个字典变量拆成多个键值对,示例如下。
data = {"a": 1, "b": 2, "c": 3}
def add(a,b,c):
print(a+b+c)
add(**data) # 相当于add(a=1,b=2,c=3)