高階函式除了可以接受函式作為引數外,還可以把函式作為結果值返回。
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
請再注意一點,當我們呼叫lazy_sum()時,每次呼叫都會返回乙個新的函式,即使傳入相同的引數:
>>> f1 = lazy_sum(1, 3, 5, 7, 9)
>>> f2 = lazy_sum(1, 3, 5, 7, 9)
>>> f1==f2
注意到返回的函式在其定義內部引用了區域性變數args,所以,當乙個函式返回了乙個函式後,其內部的區域性變數還被新函式引用,所以,閉包用起來簡單,實現起來可不容易。
另乙個需要注意的問題是,返回的函式並沒有立刻執行,而是直到呼叫了f()才執行。
練習利用閉包返回乙個計數器函式,每次呼叫它返回遞增整數:
def createcounter():
def f():
n = 0
while(true):
n += 1
yield n
inte = f()
def counter():
return next(inte)
return counter
# 測試:
countera = createcounter()
print(countera(), countera(), countera(), countera(), countera()) # 1 2 3 4 5
counterb = createcounter()
if [counterb(), counterb(), counterb(), counterb()] == [1, 2, 3, 4]:
print('測試通過!')
else:
print('測試失敗!')
函式作為返回值
就像常見的函式一樣,lambda 表示式可以返回乙個函式指標 委託例項 這就意味著我們能夠使用乙個 lambda 表示式來建立並返回另乙個 lambda 表示式。這種行為在很多場景下都是非常有用的。我們先來看下面這個例子 1 func saymyname string language 2 10ca...
將引用作為函式返回值
要以引用返回函式值,則函式定義時必須遵循以下格式 型別識別符號 函式名 形參列表及型別說明 可見,以引用返回函式值,定義函式時需要在函式名前加 引用作為函式的返回值時,函式的返回值可以理解為函式返回了乙個變數 事實上,函式返回引用時,它返回的是乙個指向返回值的隱式指標 因此,值為引用的函式可以用作賦...
將「引用」作為函式返回值型別
格式 型別識別符號 函式名 形參列表及型別說明 好處 在記憶體中不產生被返回值的副本 注意 正是因為這點原因,所以返回乙個 區域性變數的引用是不可取的。因為隨著該 區域性變數生存期的結束,相應的引用也會失效,產生runtime error 注意事項 1 不能返回 區域性變數的引用。這條可以參照eff...