*args*args是传入任意数量的参数。所有可变参数都在args中,形成一个要传递给函数的元组。*args一般用在关键字参数后面deffunc(a,*args):print(type(args))print(args)print(a)>>>func(1)()1>>>func(10,2,'a')(2,'a')10>>>func(1,2,m=3)Traceback(最近调用最后):文件“",line1,inTypeError:func()gotanunexpectedkeywordargument'm'args该参数不能接收关键字,只需要直接传递参数值。后续接收的关键字*kwargs**kwargs**kwargs是传入任意数量的关键字参数。最后传进来的关键字参数的变量个数都在kwargs里面,形成一个dict放到函数里面**kwargs只能放在函数的最后一个参数。函数参数的一般顺序是:关键字参数,args,*kwargsdeffunc(x,y,*t,**test):print(type(test))print(test.keys())print(test.values())res1=sum(t)res2=sum(test.values())print('res1:%s'%(res1))print('res2:%s'%(res2))returnres1,res2>>>func(1,2,10,20,m=100,n=200)dict_keys(['m','n'])dict_values([100,200])res1:30res2:300>>>func(1,2,10,20,30,m=100,n=200,k=-100,g=-200)dict_keys(['m','n','k','g'])dict_values([100,200,-100,-200])res1:60res2:0使用场景一个有用的使用场景(在另一个函数内部调用一个函数):定义一个函数func,实现某个函数(例如两个数字的总和)。但是项目有特殊要求,需要对结果进行各种检查(型式检查、尺寸检查等),需要对结果调用check_data()函数。如代码所示:importcheck_datadeffunc(x,y,*args,**kwargs):data=x+yis_valid=check_data(*args,**kwargs)ifis_valid:returndataelse:raiseException('dataisnotvalid')在这种情况下,x和y是关键字参数,主要用于实现函数内部的相应功能。而args和*kwargs是不确定参数,不过这里专门用来传入check_data。这样做的好处:如果check_data中需要传递的参数比较多,大部分都使用默认值。这时候如果都写在func()函数里面,就显得很多余,函数的使用也很不明确。这样在使用的时候可以将参数重点放在关键字参数上,如果check_data函数有特殊设置,那么可以通过args和*kwargs传入特殊设置的参数。灵活简洁。这种用法的注意事项是args或*kwargs仅用于一个函数或类。当多种方式使用时,很容易混淆和出错。