Python中函數的參數問題有點複雜,主要是由於參數類型問題致使的狀況比較多,下面來分析一下。html
參數類型:缺省參數,關鍵字參數,不定長位置參數,不定長關鍵字參數。python
其實總共能夠分爲 位置參數和關鍵字參數,由於位置參數被放在list裏面,關鍵字參數放在dict裏面,Python在解讀的時候首先處理list,沒有遇到關鍵字就append到list裏面,遇到關鍵字了,就開始作dict直到結束,因此,位置參數必須放在關鍵字參數前面。app
這裏總結出三個模型:函數
1:不存在缺省函數時:ui
def test(a,*args,c,d=3,**kwargs): print(a) print(args) print(c) print(d) print(kwargs) test(1,2,3,4,c=1,d=4,e=11,f=22)
運行結果:code
1 (2, 3, 4) 1 4 {'e': 11, 'f': 22}
**2:存在缺省參數,參數取默認值,(缺省參數放在*args後面)**htm
def test(a,*args,b=1,c,d=3,**kwargs): print(a) print(args) print(b) print(c) print(d) print(kwargs) test(1,2,3,4,c=1,d=4,e=11,f=22,h=66)
運行結果:blog
(2, 3, 4) 1 {'e': 11, 'f': 22, 'h': 66}
**3:存在缺省參數,參數不取默認值,(缺省參數放在*args前面)**get
def test(a,b=1,*args,c,d=3,**kwargs): print(a) print(b) print(args) print(c) print(d) print(kwargs) test(1,2,3,4,c=1,d=4,e=11,f=22,h=66)
運行結果:it
1 2 (3, 4) 1 4 {'f': 22, 'e': 11, 'h': 66}
總結:
從上面也看出來了,其實基本順序就是 位置參數--->關鍵字參數,而後就是缺省參數在 *args先後的問題了。
還有一點,前面已經說過,關鍵字參數被保存爲字典類型,也就是無序的,可是 **kwargs 須要放在最後!
轉自:http://www.javashuo.com/article/p-wyqlcegk-er.html