定義函數的時候,我們把參數的名字和位置確定下來,函數的接口定義就完成了。對於函數的調用者來說,只需要知道如何傳遞正確的參數,以及函數將返回什麼樣的值就夠了,函數內部的復雜邏輯被封裝起來,調用者無需了解。
Python的函數定義非常簡單,但靈活度卻非常大。除了正常定義的必選參數外,還可以使用默認參數、可變參數和關鍵字參數,使得函數定義出來的接口,不但能處理復雜的參數,還可以簡化調用者的代碼。
我們先寫一個計算x2的函數:
def power(x):
return x * x對於power(x)函數,參數x就是一個位置參數。
當我們調用power函數時,必須傳入有且僅有的一個參數x:
>>> power(5)25>>> power(15)225現在,如果我們要計算x3怎麼辦?可以再定義一個power3函數,但是如果要計算x4、x5……怎麼辦?我們不可能定義無限多個函數。
你也許想到了,可以把power(x)修改為power(x, n),用來計算xn,說干就干:
def power(x, n):
s = 1
while n > 0:
n = n - 1
s = s * x return s對於這個修改後的power(x, n)函數,可以計算任意n次方:
>>> power(5, 2)
25
>>> power(5, 3)
125修改後的power(x, n)函數有兩個參數:x和n,這兩個參數都是位置參數,調用函數時,傳入的兩個值按照位置順序依次賦給參數x和n。
新的power(x, n)函數定義沒有問題,但是,舊的調用代碼失敗了,原因是我們增加了一個參數,導致舊的代碼因為缺少一個參數而無法正常調用:
>>> power(5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError: power() missing 1 required positional argument: 'n'Python的錯誤信息很明確:調用函數power()缺少了一個位置參數n。
這個時候,默認參數就排上用場了。由於我們經常計算x2,所以,完全可以把第二個參數n的默認值設定為2:
def power(x, n=2):
s = 1
while n > 0:
n = n - 1
s = s * x return s這樣,當我們調用power(5)時,相當於調用power(5, 2):
>>> power(5)
25
>>> power(5, 2)
25而對於n > 2的其他情況,就必須明確地傳入n,比如power(5, 3)。
從上面的例子可以看出,默認參數可以簡化函數的調用。設置默認參數時,有幾點要注意:
一是必選參數在前,默認參數在後,否則Python的解釋器會報錯(思考一下為什麼默認參數不能放在必選參數前面);
二是如何設置默認參數。
當函數有多個參數時,把變化大的參數放前面,變化小的參數放後面。變化小的參數就可以作為默認參數。
使用默認參數有什麼好處?最大的好處是能降低調用函數的難度。
舉個例子,我們寫個一年級小學生注冊的函數,需要傳入name和gender兩個參數:<