天天看點

Python 函數的進階用法

簡述

在 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