簡述
在 Python 中,函數是一個一等公民(first-class citizen)。這意味着,函數與任何其他對象(例如:整數、字元串、清單)一緻,既可以動态地建立或銷毀,也可以傳遞給其他函數,或作為值進行傳回。
| 版權聲明:一去、二三裡,未經部落客允許不得轉載。
将函數綁定到不同的名稱
Python 中的一切皆對象,我們定義的名稱僅僅是與這些對象綁定的辨別符。函數也不例外,它們也是對象,同樣可以被綁定到不同的名稱。
>>> def greet(msg):
... print(msg)
...
>>> greet # 輸出 greet 的記憶體位址
<function greet at 0x7f38327abae8>
>>>
>>> f = greet # 将 greet 的記憶體位址當做值指派給變量 f
>>> f # 輸出 f,其實就是輸出 greet 的記憶體位址
<function greet at 0x7f38327abae8>
>>>
>>> f('Hello') # 等同于 greet('Hello')
可以看出,greet 和 f 指的是同一個函數對象。
注意: 函數名在不帶小括号(
()
)時,表示的是函數的記憶體位址。
将函數作為參數
在 Python 中,将其他函數作為參數的函數稱為高階函數。如果使用過 map()、filter() 和 reduce() 之類的函數,那麼肯定知道這一點。
下面,我們定義三個函數:add() - 求和,subtract() - 求差,operate() - 作為高階函數。
>>> def add(x, y): # 求和
... return x + y
...
>>>
>>> def subtract(x, y): # 求差
... return x - y
...
>>>
>>> def operate(func, x, y): # 高階函數 - 将函數作為參數
... result = func(x, y)
... return result
...
函數調用很簡單:
>>> operate(add, 5, 3)
8
>>>
>>> operate(subtract, 5, 3)
2
這樣,就可以将函數對象 add 和 subtract 當做 operate() 的參數進行傳遞了,使用起來非常友善。
将函數作為傳回值
函數是一個對象,是以可以作為某個函數的傳回值。
這裡涉及到一個概念 - Python 嵌套函數
來看一個簡單的求和函數,對數字 1- n 相加:
>>> def outer(): # 封閉函數
... def inner(n): # 嵌套函數
... sum = 0
... for i in range(1, n):
... sum += i
... return sum
... return inner # 傳回一個函數對象
...
當每次調用封閉函數時,都會建立一個嵌套函數的新執行個體:
>>> f = outer()
>>> f
<function outer.<locals>.inner at 0x7f38327ab9d8>
>>>
>>> f2 = outer()
>>> f2
<function outer.<locals>.inner at 0x7f38327ab950>
>>> f(5)
10
>>>
>>> f2(10)
45