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