2 Python 函式作為返回值

2021-09-25 00:17:05 字數 2548 閱讀 3212

函式作為返回值

高階函式除了可以接收函式作為引數外,還可以把函式作為結果值返回。

我們來實現乙個可變引數的求和。通常情況下,求和的函式是這樣定義的:

def lazy_sum(*args):

def sum():

ax=0

for n in args:

ax = ax + n

return ax

return sum

f = lazy_sum(1,2,3,4,5)

print f

# # lazy_sum(1,2,3,4,5)返回的是乙個指向求和的函式的函式名。

# 在呼叫lazy_sum(1,2,3,4,5)的時候,不立刻求和,而是根據後面**的需要在計算。

print f()

# 15

# 用f()呼叫求和函式,計算出結果。

f1 = lazy_sum(1,2,3,4,5,6)

f2 = lazy_sum(1,2,3,4,5,6)

print f1 == f2

# false

# lazy_sum()每呼叫一次,都會返回乙個獨一無二的函式位址。

例中,lazy_sum中的內部函式sum引用了外部函式lazy_sum的引數和區域性變數,

當lazy_sum返回函式sum時,相關引數和變數已經儲存在返回的函式sum中了。

我們稱這為閉包

注意到返回的函式在其定義內部引用了區域性變數args,所以,當乙個函式返回了乙個函式後,其內部的區域性變數還被新函式引用,所以,閉包用起來簡單,實現起來可不容易。

另乙個需要注意的問題是,返回的函式並沒有立刻執行,而是直到呼叫了f()才執行。我們來看乙個例子:

def

count():

fs =

for i in range(1,4):

deff():

return i*i

return

fsf1, f2, f3 =count()

print

f1()

print

f2()

print

f3()#9

#9#9

結果全部都是9. 不是預期的1,4,9!

#

-*- coding: utf-8 -*-

defcount():

fs =

for i in range(1,4):

deff():

return i*i

returnfs#

f1, f2, f3 = count()

#將上述**分開寫:

f1 =count()

f2 =count()

f3 =count()

print

(f1())

print

(f2())

print(f3())

結果編譯器報錯:

traceback (most recent call last):

file "***.py", line 16, in

print(f1())

typeerror: 'list' object is not callable

除錯後發現原因:

f1 = count()這條語句執行時,count()函式會先執行,並將結果fs(這是乙個包含三個元素(值是三個不同函式)的list!)返還f1。所以f1()是將list當函式用,故報錯!

f2 = count()和f3 = count()也是這個道理。

所以第乙個要弄清楚的是 :初始**中的f1, f2, f3 = count()是將count() 中返回值(list)的三個元素(元素值是函式)分別賦值給f1,f2,f3!此時它們是函式!

修改**:

#

-*- coding: utf-8 -*-

defcount():

fs =

for i in range(1,4):

deff():

return i*i

returnfs#

f1, f2, f3 = count()

f1 =count()

f2 =count()

f3 =count()

print

(f1[0]())

print

(f2[0]())

print(f3[0]())

結果仍然是:

除錯後發現,執行f1[0]() 後:

因為f1[0]()中存放的就是函式f, 但此時i是3,故返回輸出9!

所以返回閉包時牢記一點:返回函式不要引用任何迴圈變數,或者後續會發生變化的變數。

posted on

2018-02-07 21:38

...)

編輯收藏

函式作為返回值

就像常見的函式一樣,lambda 表示式可以返回乙個函式指標 委託例項 這就意味著我們能夠使用乙個 lambda 表示式來建立並返回另乙個 lambda 表示式。這種行為在很多場景下都是非常有用的。我們先來看下面這個例子 1 func saymyname string language 2 10ca...

Python將函式作為返回值

高階函式除了可以接受函式作為引數外,還可以把函式作為結果值返回。def lazy sum args def sum ax 0 for n in args ax ax n return ax return sum 請再注意一點,當我們呼叫lazy sum 時,每次呼叫都會返回乙個新的函式,即使傳入相同...

NotesDocument 作為函式返回值的問題

some code set my doc with the return value from the function.set recipientdoc getdocinnab search string if not recipientdoc is nothing then in debug i...