def func(a,*args): print(type(args)) print(args) print(a) >>>func(1) <class 'tuple'> () 1 >>>func(10,2,'a') <class 'tuple'> (2, 'a') 10 >>>func(1,2,m=3) Traceback (most recent call last): File "<input>", line 1, in <module> TypeError: func() got an unexpected keyword argument 'm'
args参数不能接收关键字,只须要直接传参数值。接收关键字的是后续的*kwargspython
def func(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)) return res1,res2 >>>func(1,2,10,20,m=100,n=200) <class 'dict'> dict_keys(['m', 'n']) dict_values([100, 200]) res1:30 res2:300 >>>func(1,2,10,20,30,m=100,n=200,k=-100,g=-200) <class 'dict'> dict_keys(['m', 'n', 'k', 'g']) dict_values([100, 200, -100, -200]) res1:60 res2:0
一个颇有用的使用场景(在一个函数内部调用另外一个函数):函数
定义一个函数func,实现某种功能(好比求两数之和)。而项目有特殊要求,须要对结果进行各类检验(类型检验,大小检验等等),须要对结果调用check_data()函数。如代码所示:code
import check_data def func(x,y,*args,**kwargs): data=x+y is_valid=check_data(*args,**kwargs) if is_valid: return data else: raise Exception('data is not valid')
这种时候,x和y是关键字参数,主要用在函数内部进行相应功能的实现。而args和*kwargs则是不定参数,但这里专门用来传入check_data中。input
这样作的好处:若是check_data里面有不少参数须要传递,大部分是使用默认值,这个时候若是在func()函数里都写出来会很是冗余,使用函数很是不清晰。经过这种方式,能够在使用时将参数重点放在关键字参数上,而若对check_data函数有特殊设置,再对有特殊设置的参数经过args和*kwargs传进去。灵活且简洁。io
这种使用方式须要注意的是args或者*kwargs只用在一个函数或类上。用于多个极易混淆出错。ast