一.介绍
1.*args和**kwargs这两个对于函数来说是可变参数
2.*args返回的是一个元祖
3.**kwargs返回的是一个字典
二.演示
说明:对于以下函数,*args可以识别非a=1这种关键字参数以外的所有参数;**kwargs只能识别a=1这种关键字参数,其他的都不识别
def add(*args, **kwargs): #*args和**kwargs是打包过程 print(args, kwargs)add(1, 2, 3, 4, a=1, b=2)add(1)add(a=1, b=2)add(1, {"a": 1})add("1", [1, 2], {"a": 1}, (1, 2))add(*[1, 2], **{"a": 1})
结果:
(1, 2, 3, 4) {'a': 1, 'b': 2}
(1,) {}() {'a': 1, 'b': 2}(1, {'a': 1}) {}('1', [1, 2], {'a': 1}, (1, 2)) {}(1, 2) {'a': 1}
结论:
1.很明显只有a=1,b=2这种的**kwargs才能识别到,要不然就返回空字典;对于非a=1,b=2这种的*args才能识别到,要不然返回一个空的元祖。
2.但是对于add(*[1, 2], **{"a": 1})这种情况呢,结果为啥是(1, 2) {'a': 1},而不是([1,2],{"a":1})呢,那是因为当你在*(1,2)前面加个*号那么就相当于把它拆成1,2两个数字了,然后传给了*args了,那对于**{"a":1}前面加个两个*号那么就相当于把它拆成a=1了,然后传给了**kwargs,所以最后结果就是(1, 2) {'a': 1}。这也就是拆包的过程。