人人都能學會的python程式設計教程12:函式的引數

程式設計老司機發表於2018-05-10

Python的函式定義非常簡單,也非常靈活。除了正常定義的必選引數外,還可以使用預設引數、可變引數和關鍵字引數,使得函式定義出來的介面,不但能處理複雜的引數,還可以簡化呼叫者的程式碼。

位置引數

我們先寫一個計算x的平方的函式:

def power(x): return x * x

這裡的引數x就是一個位置引數。

當我們呼叫power函式時,必須傳入有且僅有的一個引數x:

power(5)25

那麼如果我想要計算x的n次方,怎麼辦呢?

聰明的你一定想到了。沒錯就是定義2個引數,如下:

def power(x, n): s = 1 while n > 0: n = n - 1 s = s * x return s

預設引數

新的power(x, n)函式定義沒有問題,但是,舊的呼叫程式碼失敗了,原因是我們增加了一個引數,導致舊的程式碼因為缺少一個引數而無法正常呼叫。這個時候,預設引數就排上用場了。由於我們經常計算x的平方,所以,完全可以把第二個引數n的預設值設定為2。

寶寶都能學會的python程式設計教程12:函式的引數

從上面的例子可以看出,預設引數可以簡化函式的呼叫。設定預設引數時,有幾點要注意:

一是必選引數在前,預設引數在後,否則Python的直譯器會報錯(思考一下為什麼預設引數不能放在必選引數前面);

二是如何設定預設引數。

當函式有多個引數時,把變化大的引數放前面,變化小的引數放後面。變化小的引數就可以作為預設引數。

使用預設引數有什麼好處?最大的好處是能降低呼叫函式的難度。

定義預設引數要牢記一點:預設引數必須指向不變物件!

為什麼要設計str、None這樣的不變物件呢?因為不變物件一旦建立,物件內部的資料就不能修改,這樣就減少了由於修改資料導致的錯誤。此外,由於物件不變,多工環境下同時讀取物件不需要加鎖,同時讀一點問題都沒有。我們在編寫程式時,如果可以設計一個不變物件,那就儘量設計成不變物件。

可變引數

在Python函式中,還可以定義可變引數。顧名思義,可變引數就是傳入的引數個數是可變的,可以是1個、2個到任意個,還可以是0個。

我們以數學題為例子,給定一組數字a,b,c……,請計算a2 + b2 + c2 + ……。

寶寶都能學會的python程式設計教程12:函式的引數

定義可變引數和定義一個list或tuple引數相比,僅僅在引數前面加了一個*號。在函式內部,引數numbers接收到的是一個tuple,因此,函式程式碼完全不變。但是,呼叫該函式時,可以傳入任意個引數,包括0個引數。

如果已經有一個list或者tuple,要呼叫一個可變引數怎麼辦?*nums表示把nums這個list的所有元素作為可變引數傳進去。這種寫法相當有用,而且很常見。

關鍵字引數

關鍵字引數允許你傳入0個或任意個含引數名的引數,這些關鍵字引數在函式內部自動組裝為一個dict。

def person(name, age, **kw): print('name:', name, 'age:', age, 'other:', kw)

函式person除了必選引數name和age外,還接受關鍵字引數kw。在呼叫該函式時,可以只傳入必選引數。

person('Michael', 30)

也可以傳入任意個數的關鍵字引數:

person('Bob', 35, city='Beijing') person('Adam', 45, gender='M', job='Engineer')

關鍵字引數有什麼用?它可以擴充套件函式的功能。比如,在person函式裡,我們保證能接收到name和age這兩個引數,但是,如果呼叫者願意提供更多的引數,我們也能收到。試想你正在做一個使用者註冊的功能,除了使用者名稱和年齡是必填項外,其他都是可選項,利用關鍵字引數來定義這個函式就能滿足註冊的需求。

命名關鍵字引數

對於關鍵字引數,函式的呼叫者可以傳入任意不受限制的關鍵字引數。至於到底傳入了哪些,就需要在函式內部通過kw檢查。 如果要限制關鍵字引數的名字,就可以用命名關鍵字引數,例如,只接收city和job作為關鍵字引數。這種方式定義的函式如下:

def person(name, age, *, city, job): print(name, age, city, job)

和關鍵字引數**kw不同,命名關鍵字引數需要一個特殊分隔符*,*後面的引數被視為命名關鍵字引數。

呼叫方式如下:

person('Jack', 24, city='Beijing', job='Engineer')

如果函式定義中已經有了一個可變引數,後面跟著的命名關鍵字引數就不再需要一個特殊分隔符*了:

def person(name, age, *args, city, job): print(name, age, args, city, job)

引數組合

在Python中定義函式,可以用必選引數、預設引數、可變引數、關鍵字引數和命名關鍵字引數,這5種引數都可以組合使用。但是請注意,引數定義的順序必須是:必選引數、預設引數、可變引數、命名關鍵字引數和關鍵字引數。

比如定義一個函式,包含上述若干種引數:

寶寶都能學會的python程式設計教程12:函式的引數

相關文章