2.14. 定義函式

函式 將一段程式碼以一個名稱封裝起來,以便能從許多地方呼叫它。任何時候只要某項計算、動作或具特定形態的工作出現了不止一次,函式就能把它變成單一具名的東西。

關鍵字是 def

def greet(name):
    print("hello,", name)

greet("Alice")
greet("Bob")

輸出::

hello, Alice
hello, Bob

def 開頭的行是 定義 -- 它建立了函式,但不執行函式本體。呼叫 greet("Alice") 才會執行那段縮排的區塊。

2.14.1. 參數與引數

def 行括號中的名稱是 參數 -- 它們是呼叫者將提供之值的佔位符。實際傳入的值則是 引數。函式可以接受零個或多個參數:

def square(x):
    return x * x

def add(a, b):
    return a + b

def is_even(n):
    return n % 2 == 0

以錯誤數量的引數呼叫會立即引發 TypeError

2.14.2. return

return 陳述式會立即結束函式,並將一個值交還給呼叫者:

def absolute(x):
    if x < 0:
        return -x
    return x

從未抵達 return(或只有一個不帶值的裸 return)的函式會回傳 None

>>> def shout(text):
...     print(text.upper())
...
>>> result = shout("hi")
HI
>>> print(result)
None

函式可以有數個 return 陳述式;最先抵達的那一個生效,函式本體的其餘部分會被略過。

2.14.2.1. 回傳多個值

Python 每次呼叫只回傳一個物件,但該物件可以是一個 tuple -- 而呼叫者可以當場將其解包:

def minmax(values):
    return (min(values), max(values))

lo, hi = minmax([3, 1, 4, 1, 5, 9])

回傳值周圍的括號是選用的;return a, breturn (a, b) 是相同的。

2.14.3. 文件字串(Docstring)

放置於函式本體第一個陳述式位置的字串字面值就是 文件字串。它會儲存在函式物件上,也是 help() 所顯示的內容:

def scale(value, factor):
    """Multiply ``value`` by ``factor`` and return the result."""
    return value * factor

當游標停留在函式名稱上方時,IDE 會在工具提示中顯示文件字串,因此即便只是一行摘要也值回票價。三引號字串可讓文件字串在需要更多細節時跨越多行。

2.14.4. 命名慣例

函式名稱使用 snake_case -- 以底線分隔的小寫單字。名稱應描述該函式所做的事:

  • 好的read_temperatureparse_headeris_valid

  • 應避免do_stuffhandle1temp_func

前置底線(_helper)將函式標記為其模組的內部使用。這個慣例受到廣泛尊重,但並非由 Python 強制執行。