什么是*args和**kwargs?
1. 拆包
*
和**
可以很方便的分别实现元组(列表、集合)和字典的拆包,拆包顾名思义就是将容器中的元素给一个一个拆出来:
ls1 = [1, 2, 3, 4]
ls2 = [*ls1, 5, 6, 7]
print(ls1)
dic1 = {'one':1, 'two':2, 'three':3}
dic2 = {**dic1 ,'four':4, 'five':5}
print(dic2)
'''
[1, 2, 3, 4]
{'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5}
'''
2. 任意参数
但如果将*
和**
应用到函数的传参当中来,那情况将会正好相反,*args可以将所有传入的非关键字参数保存在args这个元组中,并且顺序和你输入的顺序一致,所有的关键字参数保存到kwargs这个字典中,就像下面这样:
def func(*args, **kwargs):
print(args)
print(kwargs)
func(1, 3, 5, 7, x=3, y=4, z=3)
'''
(1, 3, 5, 7)
{'x': 1, 'y': 2, 'z': 3}
'''
通过*
和**
就可以向一个函数传入任意的参数。
但是一旦使用*args和**kwargs接收参数,所有的形参和关键字参数都要放在最前面,也不要放在中间,否则不仅显得很low,还会报错,代码如下:
def func(*args, **kwargs, x=3):
print(args)
print(kwargs)
func(1, 3, 5, 7, x=3, y=4, z=3)
'''
File "<ipython-input-31-0e57d13e670f>", line 1
def func(*args, **kwargs, x=3):
^
SyntaxError: invalid syntax
'''
args和kwargs并不是固定的,也可以使用其他的名字,但是args和kwargs是比较通用的命名。