简介
萌新看代码的时候经常看到使用Python函数的时候用到*,以前用c或者java的时候从来没看过,看的是一脸懵逼,因此差了一点资料理解了一下使用方法,记录在此用以备忘。
一、在定义函数时参数使用*
1.1 定义时形参使用单*
举个例子:def test(*args):
意思是把传入的参数都装在元组args中。
调用时使用test(1,2,3)就相当于传入了一个args=(1,2,3)的元组。
1.2 定义时形参使用双*
举个例子:def test(**kwargs):
kwargs是关键字参数的意思,意思是把传入的参数转换为字典kwargs中。
调用时使用test(a=1,b=‘two’,c=‘c3’)相当于传入了一个kwargs={‘a’:1,‘b’:‘two’,c:‘c3’}的字典。
二、在调用函数时参数使用*
首先定义一个函数 def test(a,b,c,d):
2.1 调用时实参使用单*
举个例子:test(*args)
意思是把元组args中每个元素当作位置参数传入函数中。
假设args=(1,2,3,4)
调用时使用test(*args)就相当于test(a=1,b=2,c=3,d=4)
2.2 调用时实参使用双*
举个例子:test(**kwargs)
意思是把字典kwargs中每个元素当作关键字参数传入函数中。
假设kwargs={‘a’:1,‘b’:2,‘c’:3,‘d’:4}
调用时使用test(**kwargs)相当于test(a=1,b=2,c=3,d=4)
注释:根据我的理解,如果调用时kwargs中关键字和定义时不完全一致的话会报错,但是不知道是不是这样,希望各位大佬给个解答。
三、个人小结
一般比较常见的还是作为形参使用*和**,前者用作取元组,后者用于取字典。
作为实参使用时,前者用来传元组,后者用来传字典。
作为形参时,**必须放在最后面,否则会把定义的别的关键字给吞了。
最后放一段代码帮助理解。
def test(a,*args,**kwargs):
print a
print args
print kwargs
test(1,2,3,d='4',e=5)
输出结果:
1
(2, 3)
{'e': 5, 'd': '4'}