Python基礎 高階函式之返回函式(二)

2021-08-20 02:25:29 字數 1702 閱讀 2565

既然函式是乙個變數,那麼當然可以把函式作為結果值返回。先簡單看乙個示例:

首先我們定義乙個函式實現可變引數之積:

>>> from functools import reduce

>>> def fac(*args):

... return reduce(lambda x, y: x * y, args)

...>>> fac(1, 2, 3, 4, 5)

120

但是,如果不需要立即求得可變引數之積,而是在後面**中根據需要計算,怎麼做? --- 此時可以不返回求積結果,而是返回乙個求積函式。

>>> from functools import reduce

>>> def lazy_fac(*args):

... def multiply():

... return reduce(lambda x, y: x * y, args)

... return multiply

...>>> func = lazy_fac(1, 2, 3, 4, 5, 6, 7)

>>> func

.multiply at 0x000001e3e8ec47b8>

關於返回函式存在的乙個小問題,如下:

def multiply():

m_func =

for i in range(3):

def mul():

return pow(i, 3)

return m_func

mul1, mul2, mul3 = multiply()

print(mul1(), mul2(), mul3())

對於上面的**,我們計畫的想要返回0, 1, 8;然而實際卻返回了8, 8, 8,為什麼?

因為返回的函式引用了變數i,但是呼叫multiply()返回的每個函式都不是立刻執行,在執行時i已經變為3,所以每個函式都返回了8。因此我們需要注意,返回函式不要引用任何迴圈變數,或者後續可能會發生改變的變數。如果一定要引用迴圈變數,則改變如下:

def multiply():

def f(x):

return lambda: pow(x, 3)

m_func =

for i in range(3):

return m_func

mul1, mul2, mul3 = multiply()

print(mul1(), mul2(), mul3())

示例1:利用閉包返回乙個計數器函式,每次呼叫它返回遞增整數:

def createcounter():

# digit = [0]

digit = 0

def counter():

# digit[0] += 1

nonlocal digit

digit += 1

# return digit[0]

return digit

return counter

countera = createcounter()

print(countera(), countera(), countera(), countera(), countera())

上述**,注釋部分是另一種解決方案。

Python基礎 高階 返回函式

帶返回結果的函式 示例 usr bin env python3 coding utf 8 python 返回函式 求和,返回值 defsum x,y return x y print sum 1,2 執行結果 d pythonproject python run.py 3延遲返回結果的函式 示例 u...

python 高階函式 返回函式

此文參考自廖雪峰python 何為高階函式?高階函式英文叫higher order function。把函式作為引數傳入,這樣的函式稱為高階函式,函式式程式設計就是指這種高度抽象的程式設計正規化。高階函式除了可以接受函式作為引數外,還可以把函式作為結果值返回。乙個函式可以返回乙個計算結果,也可以返回...

python基礎 高階函式

把函式作為引數傳入,這樣的函式稱為高階函式,高階函式是函式式程式設計的體現。函式式程式設計就是指這種高度抽象的程式設計正規化。在python中,abs 函式可以完成對數字求絕對值計算。abs 10 10round 函式可以完成對數字的四捨五入計算。round 1.2 1 round 1.9 2def...