Python函數參數定義及傳遞方式解析

python中函數定義參數有四種形式:python

def fun1(a,b,c):
  pass
def fun2(a=1,b=2,c=3):
  pass
def fun3(*args):
  pass
def fun4(**kargs):
  pass

四種中最多見是前兩種,基本上通常點的教程都會涉及,後兩種通常不多單獨出現,經常使用在混合模式中ide

第一種 fun1(a,b,c)是直接將實參賦予形參,根據位置作匹配,即嚴格要求實參的數量與行參的數量位置相等,比較通常,大多數語言經常使用這種方式。函數

第二種 fun2(a=1,b=2,c=3)根據鍵值對的形式作實參與形參的匹配,經過這種式就能夠忽略了參數的位置關係,直接根據關鍵字來進行賦值,同時該種傳參方式還有個好處就是能夠在調用函數的時候做爲個別選填項,不要求數量上的相等,便可以fun5(3,4)來調用fun2函數,這裏關鍵就是前面的3,4覆蓋了原來a、b兩個形參的值,但c仍是不變採用原來的默認值3,這種模式相較第一種更加靈活,不只能夠經過fun6(c=5,a=2,b=7)來打亂行參的位置,並且能夠在沒有對應形參傳遞的時候使用定義函數時的默認值。學習

第三種 fun3(*args) ,這定義方式在傳參時是能夠傳入任意個參數,這些若干參數都被放到了tuple元組中賦值給行參args,以後要在函數中使用這些行參,直接操做args這個tuple元組就能夠了,這樣的好處是在參數的數量上沒有了限制,可是由於是tuple,其自己仍是有次序的,這就仍然存在必定的束縛,在對參數操做上也會有一些不便spa

第四種 fun4(**kargs)最爲靈活,其是以鍵值對字典的形式向函數傳參,含有第二種位置的靈活的同時具備第三種方式的數量上的無限制。此外第三四種函數聲明的方式前的'*',與c裏面的指針聲明同樣,這裏僅作聲明標識之用指針

最後要強調的是四種定義和傳遞方式混合使用(大多數狀況是這種),fun7(a,b,c,**d),但四種方式混用時要遵照:定義和傳遞時,*kargs必須在*args以後教程

混合使用時的賦值過程爲:get

一、先根據前兩種形式定義的函數,按順序把實參賦值給對應的形參;it

二、將多餘出非鍵值對實參打包組成一個tuple傳遞給*args;io

三、將多餘的key=value形式的實參打包正一個dicrionary傳遞給**kargs

舉例

def test(x,y=5,*a,**b):
  print x,y,a,b
#調用結果:
test(1) ===> 1 5 () {}
test(1,2) ===> 1 2 () {}
test(1,2,3) ===> 1 2 (3,) {}
test(1,2,3,4) ===> 1 2 (3,4)
test(x=1) ===> 1 5 () {}
test(x=1,y=1) ===> 1 1 () {}
test(x=1,y=1,a=1) ===> 1 1 () {'a':1} 
test(x=1,y=1,a=1,b=1) ===> 1 1 () {'a':1,'b':1}
test(1,y=1) ===> 1 1 () {}
test(1,2,y=1) ===> 出錯,說y給賦了多個值
test(1,2,3,4,a=1) ===> 1 2 (3,4) {'a':1}
test(1,2,3,4,k=1,t=2,o=3) ===> 1 2 (3,4) {'k':1,'t':2,'o':3}

以上就是本文的所有內容,但願對你們的學習有所幫助,也但願你們多多支持。

相關文章
相關標籤/搜索