Python: 函式引數魔法

發表於2016-12-05

函式引數

在 Python 中,定義函式和呼叫函式都很簡單,但如何定義函式引數和傳遞函式引數,則涉及到一些套路了。總的來說,Python 的函式引數主要分為以下幾種:

  • 必選引數
  • 預設引數
  • 可變引數
  • 關鍵字引數

必選引數

必選引數可以說是最常見的了,顧名思義,必選引數就是在呼叫函式的時候要傳入數量一致的引數,比如:

預設引數

預設引數是指在定義函式的時候提供一些預設值,如果在呼叫函式的時候沒有傳遞該引數,則自動使用預設值,否則使用傳遞時該引數的值。

看看例子就明白了:

可以看到,預設引數使用起來也很簡單,但有兩點需要注意的是:

  • 預設引數要放在所有必選引數的後面
  • 預設引數應該使用不可變物件

比如,下面對預設引數的使用是錯誤的:

再來看看為什麼預設引數應該使用不可變物件。

我們看一個例子:

在上面的函式中,L 是一個預設引數,預設值是 [],表示空列表。

我們來看看使用:

為啥呢?我們在呼叫函式的時候沒有傳遞引數,那麼就預設使用 L=[],經過處理,L 應該只有一個元素,怎麼會出現呼叫函式兩次,L 就有兩個元素呢?

原來,L 指向了可變物件 [],當你呼叫函式時,L 的內容發生了改變,預設引數的內容也會跟著變,也就是,當你第一次呼叫時,L 的初始值是 [],當你第二次呼叫時,L 的初始值是 ['END'],等等。

所以,為了避免不必要的錯誤,我們應該使用不可變物件作為函式的預設引數。

可變引數

在某些情況下,我們在定義函式的時候,無法預估函式應該制定多少個引數,這時我們就可以使用可變引數了,也就是,函式的引數個數是不確定的。

看看例子:

在上面的程式碼中,numbers 就是一個可變引數,引數前面有一個 * 號,表示是可變的。在函式內部,引數 numbers 接收到的是一個 tuple。

在呼叫函式時,我們可以給該函式傳遞任意個引數,包括 0 個引數:

上面的 * 表示任意引數,實際上,它還有另外一個用法:用來給函式傳遞引數。

看看例子:

再看一個例子:

關鍵字引數

可變引數允許你將不定數量的引數傳遞給函式,而關鍵字引數則允許你將不定長度的鍵值對, 作為引數傳遞給一個函式。

讓我們看看例子:

在上面的程式碼中,kwargs 就是一個關鍵字引數,它前面有兩個 * 號。kwargs 可以接收不定長度的鍵值對,在函式內部,它會表示成一個 dict。

和可變引數類似,我們也可以使用 **kwargs 的形式來呼叫函式,比如:

再看一個例子:

引數組合

在實際的使用中,我們經常會同時用到必選引數、預設引數、可變引數和關鍵字引數或其中的某些。但是,需要注意的是,它們在使用的時候是有順序的,依次是必選引數、預設引數、可變引數和關鍵字引數

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

在呼叫函式的時候,Python 會自動按照引數位置和引數名把對應的引數傳進去。讓我們看看:

我們還可以通過下面的形式來傳遞引數:

小結

  • 預設引數要放在所有必選引數的後面。
  • 應該使用不可變物件作為函式的預設引數。
  • *args 表示可變引數,**kwargs 表示關鍵字引數。
  • 引數組合在使用的時候是有順序的,依次是必選引數、預設引數、可變引數和關鍵字引數。
  • *args**kwargs 是 Python 的慣用寫法。

參考資料

相關文章