目录
python中很多参数传递或者函数定义的时候用到了*args和**kwargs这样形式的符号,*args和**kwargs究竟有何作用呢。用于不同位置作用肯定不相同,让我们分开来看一看。
一.调用函数的时候用*args作为参数传递:拆包
1.*args用于参数传递的作用
*args用于参数传递,作用是对元祖或者列表进行拆包(解包)。
2.拆包是什么意思
元祖或者列表可以当成一个整体作为一个参数传递给调用的函数,也可以把元祖或者列表中的每一个元素作为参数传递给函数。把每一个元素作为参数我们可以叫做拆包。
让我们来看看如下的例子理解一下*args:
t=(1,2,3,4)
print(t)
#print(t)的运行结果为(1, 2, 3, 4)
print(*t)
#print(*t)的运行结果为1 2 3 4
从这个例子我们获取到一个信息:如果t是一个元祖,*t取出了元祖中所有的元素。
让我们再来看一个*args作为参数传递的例子:
#定义一个cb函数,调用时需要传递四个参数
def cb(a,b,c,d):
print(a+b+c+d)
t=(1,2,3,4)
#*t作为参数传递给cb函数
cb(*t)
#运行结果为:10
从这个例子可以看出函数cb调用时需要四个参数的,直接把*t作为参数传递是OK的,说明*t的作用就是把元祖(1,2,3,4)中的四个元素拆成四个参数来传递,这个过程就是拆包。
二.调用函数的时候用**kwargs作为参数传递:拆包
理解了上面的*args作为参数传递后,**kwargs作为参数传递也是类似的,不同点就是**kwargs是对字典的拆包。
直接来看一个例子:
#定义一个cb2函数,调用时需要传递四个参数
def cb2(a,b,c,d):
print(a+b+c+d)
d={"a":1,"b":2,"c":3,"d":4}
#**d作为参数传递给cb2函数,等价于cb2(a=1,b=2,c=3,d=4)
cb2(**d)
#运行结果为:10
这个例子可以看出**d可以直接作为参数来传递,相当于把字典中的键值对拆包成了key=vaule的形式来传递:cb2(**d)等同于cb2(a=1,b=2,c=3,d=4)