要區分好**kwargs
和*args
,要理解另外兩個概念非關鍵字參數
和關鍵字參數
非關鍵字參數
和關鍵字參數
- 關鍵字參數
用一個叫student
的函數說明,更好理解:
student( name, age=0, gender='M')
有三個參數:name
,age
,gender
用關鍵字給student
函數傳遞參數時,不需要要跟著順序來也沒問題,如:
student( age=18, name='Sarah', gender='G')
或者student(name='Sarah', gender='G', age=18)
- 非關鍵字參數
還是用student
的函數來說明:
student( name, age=0, gender='M')
這時就只能按三個參數的順序來傳遞參數了,打亂順序就報錯,如:
student( 18, 'G', 'Sarah')
就會報錯,改正爲:student( 'Sarah', 18, 'G')
就可以了。
然後**kwargs
和*args
就好理解了:
*args
只能傳遞非關鍵字參數
**kwargs
只能傳遞關鍵字參數
,不帶關鍵字是傳遞不了的,要注意
繼續用剛剛的例子說明:
def student(name, age=0, gender='M'):
print('name:', name)
print('age:', age)
print('gender:', gender)
一般情況我們都是直接賦值給函數,如:
student('Sarah', 18, 'G')
但實際上,我們做的項目,參數太多了,要是還這麼操作,debug一次就少一個程序猿,哈哈哈。所以會使用更方便的方式,就是用**kwargs
和*args
,一般用得比較多的是*args
,個人見解。但現在發現**kwargs
更好方便理解和debug,對比兩種方法:
# 使用*args
args_list = ('Sarah', 18, 'G')
student(*args_list)
# 使用**kwargs
kwargs_dict = {'name': 'Sarah', 'age': 18, 'gender': 'G'}
student(**kwargs_dict)
三個的輸出都是:
name: Sarah
age: 18
gender: G
但它們用的方法是不同的。