目录:
1. 概括:什么*args和**kwargs
2. 进一步了解
3. *args参数的使用
4. **kwargs参数的使用
5. 参数x、*args、**kwargs的位置
tip:基于python3.5
1. 概括:什么*args和**kwargs
刚开始学python的时候,我发现好多项目中都有这两个参数,这到底是干嘛的呢?看着这几个**,我想起了C语言中的指针,陷入了深深的沉思…
查阅了一些资料,发现这两个参数的应用场景是:当我要传入的参数个数不定、长度不定时,可以使用这两个变量。
2. 进一步了解
叫做可变长参数列表,本质上是tuple和dict。重要的不是args和kwargs。重要的是*和**,哪怕是这么写:*amao和**agou。看下面的例子:
def function(*args, **kwargs): print("args", args, type(args)) print("kwargs", kwargs, type(kwargs)) print("="*40) def function1(*amao, **agou): print("amao", amao, type(amao)) print("agou", agou, type(agou)) print("="*40) function(1, b=2) function1(3, b=4)
结果:
args (1,) <class 'tuple'> kwargs {'b': 2} <class 'dict'> ======================================== amao (3,) <class 'tuple'> agou {'b': 4} <class 'dict'> ========================================
3. *args参数的使用
*args是位置参数,按照位置传值。不光像上面说的,可以传可变长度的参数;同时还能接收剩余的参数,这里重点说后者。
例如:*args接收剩余的参数
def function(x, y, *args): print(x, y, args) print("=" * 40) function(1, 2, 3, 4, 5)
结果:
1 2 (3, 4, 5) ========================================
例如:当*args参数位置不是最后一个时,也就是说*args参数后面还有一个参数的时候会是什么样?
def function(x, y, *args, z): print(x, y, args, z) print("=" * 40) function(1, 2, 3, 4, 5)
结果就报错了:
TypeError: function() missing 1 required keyword-only argument: 'z'
这时候指定参数,z=6就不会报错了。
def function(x, y, *args, z=6): print(x, y, args, z) print("=" * 40) function(1, 2, 3, 4, 5)
输出结果:
1 2 (3, 4, 5) 6 ========================================
4. **kwargs参数的使用
**kwargs是可变的关键词参数列表。python中以dict类型展示出来。
这个参数的作用与上类似,可以接收边长参数,接收剩余参数。不同的是这个类型是字典。
举例:
def function(**kwargs): print(kwargs) print("=" * 40) function(a=1, b=2, c=3)
结果:
{'a': 1, 'b': 2, 'c': 3} ========================================
接收剩余参数的例子:
def function(x, **kwargs): print(x, kwargs) print("=" * 40) function(10, a=1, b=2, c=3)
结果:
10 {'a': 1, 'c': 3, 'b': 2} ========================================
如果我把x和**kwargs位置调换呢?
def function(**kwargs, x): print(x, kwargs) print("=" * 40) function(a=1, b=2, c=3, 10)
结果报错了,说我语法错误:
def function(**kwargs, x): ^ SyntaxError: invalid syntax
5. 参数x、*args、**kwargs的位置
通过以上的例子我们还发现了一个问题,那就是位置问题,上面的两个例子中,将*args/**kwargs 和 参数x调换时,都报错了。
我们再试一下,参数x在前面,更换*args和**kwargs位置,会发生什么?
def function(x, **kwargs, *args): print(x, args, kwargs) print("=" * 40) function(1, a=3, b=4, c=5, 6, 7)
结果报错了,又说我语法错误:
def function(x, **kwargs, *args): ^ SyntaxError: invalid syntax
通过以上的实验总结,参数x、*args、**kwargs三个参数的位置必须是一定的。必须是(x,*args,**kwargs)这个顺序。
打好基础,比什么都强