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