1.F(arg1,arg2,...)
2.F(arg2=,arg3=...)
3.F(*arg1)
4.F(**arg1)
第1號
這種方式是最“傳統”的方式:壹個函數可以定義無限個參數,參數(形參)放在函數名後面的括號裏,參數之間用逗號隔開。以這種方式定義的函數在調用時也必須在函數名後面的括號中提供相同數量的值(實際參數),並且順序必須相同。也就是說,形參和實參的個數必須相同,形參1的值必須是實參中的第壹個,並且形參和實參是壹壹對應的,即“形參1=實參1”
形參2=實參2...".顯然,這是壹種非常不靈活的形式。比如:“def addOn(x,y):返回x+
y”,這裏定義的函數addOn,可以以addOn(1,2)的形式調用,也就是說形參X取1的值,master取2的值。AddOn(1,2,3)和AddOn
(1)都是形式不對。
第二種方法比1方法好壹點,在定義的時候已經為每個參數定義了默認值。因此,在調用這個函數時,如果沒有實參傳遞給相應的形參,那麽形參將使用默認值。例如:“def
addOn(x=3,y=5):返回x +
Y”,那麽addOn(6,5)的調用形式表示參數X取值6,Y取值5。另外,addOn(7)的形式也是可以的,也就是說形參X取值7,y取默認值5。這個時候,就會出現壹個問題。如果想讓X取默認值,用實參給Y賦值呢?前兩種調用形式明顯不好,需要Python中函數調用方法的另壹招。
——關健的詞賦法。可以使用addOn(y=6),這意味著x取默認值3,y取值6。這樣就可以通過指定形式參數來“精確攻擊”形式參數,而壹個子帶的作用就是不需要遵循形式參數的順序,比如:addOn(y=4,x=6),也是可以的。這種通過形參進行定點賦值的方式也適用於1方式定義的函數。
上述兩種方法中定義的形參數量是固定的。例如,如果在定義函數時定義了五個形參,那麽在調用時最多只能向它傳遞五個實參。但是在實際編程中,並不總是能夠確定壹個函數將有多少個參數。第三種方法用於處理這種情況。用壹個*加壹個形式參數名來表示,這個函數的實際參數不壹定是零或n,無論多少,都是以參數名作為函數內部的標識符存儲在元組中。例如:
調用addOn() addOn(2) addOn(3,4,5,6)等等就可以了。
類似於第三種方式,在形參名前面加兩個*號,形參會以形參名作為函數內部的標識符存儲在字典中。此時,調用函數的形式必須是key1=value1,key2=value2...例如:
1.def addOn(**arg):
2.總和= 0
3.如果len(arg) == 0:返回0
4.否則:
5.對於arg.itervalues()中的x:
6.總和+= x
7.返回總和
那麽這個函數的調用可以通過addOn()或者以addOn(x=4,y=5,k=6)之類的方式進行。
以上四種定義函數形式的方式及其調用方法分別說。實際上,這四種方式可以組合起來形成復雜多樣的形式參數定義形式。定義或調用此函數時,請遵循以下規則:
1.arg=必須在arg之後。
2.*arg必須在arg=之後
3.**arg必須在*arg之後。
在函數調用過程中,參數賦值的過程如下:
首先,將“arg”形式的實參按順序賦予相應的形參。
其次,將“arg=”形式的參數分配給表單。
第三,將“arg”形式的額外參數組合成壹個元組,並用星號給出形參。
第四,將“key=value”形式的額外實參轉換成帶有兩個星號的形參字典。
聽起來好復雜,其實很簡單。非常直觀,看例子:
1.定義測試(x,y=5,*a,**b):
2.打印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)= = & gt;1 5 () {}
test(x=1,y=1) == >1 1 () {}
test(x=1,y=1,a = 1)= = = & gt;1 1 () {'a':1}
test(x=1,y=1,a=1,b = 1)= = & gt;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)= = = & gt;1 2 (3,4) {'k':1,' t':2,' o':3}