python學習筆記1 -- 函數語言程式設計之高階函式 使用函式作為返回值
阿新 • • 發佈:2020-07-24
使用函式作為返回值,看起來就很高階有木有,前面瞭解過函式名本身就是一個變數,就比如abs()函式,abs只是變數名,而abs()才是函式呼叫,那麼我們如果把ads這個變數作為返回值返回會怎麼樣呢,這就是返回函數了。
舉個栗子:當我們需要計算一個序列的和,但是並不希望現在就顯示,而是在我想要使用的時候顯示那可以通過如下方式
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
這樣當我們呼叫這個函式
f = lazy_sum(3, 6)的時候,你猜函式返回是啥,對,沒錯,返回 sum,注意是sum而不是 sum(),而當只有為sum()的時候,才是真正的函式呼叫,去計算結果,
那麼神奇的事情就發生了,我們可以再任意位置通過
f()的方式去呼叫函式,並且返回 一個 9 的計算結果。
大佬(我)總結了,劃重點:呼叫的函式叫外函式,返回的函式叫內函式,
返回函式後的變數指向內函式,因此,返回的函式其實是內函式
這裡說到內函式就要說到閉包,這裡內函式用到了外函式的變數 *args,其實內函式可以一直用外函式的變數,那是為啥呢,就是因為閉包,普通函式在宣告週期結束後他的記憶體空間也就釋放了,內容也就沒了,但是返回函式的
高階函式就不一樣了,他允許被內函式呼叫的變數在外函式結束後繼續繫結給內函式,怎麼說呢,就好像你朋友租了一間房子,然後房子裡有個微波爐很好用,本以為和睦相處,但是你朋友住了幾天搬走了,你又捨不得那個微波爐,你天天想用,那怎麼辦呢,房東答應你,雖然你朋友不住了,但是你可以繼續使用這個微波爐,這就是閉包,大概就是這個意思,雖然外
函式嗝屁了,但是內函式要用外函式的東西,那這個東西就不能沒了,會繼續繫結到內函式繼續使用,直到內函式也嗝屁了才結束
練習過程中遇到另一個很坑的問題就是一個語法:
def count():
fs = []
for i in range(1, 4):
def f():
return i*i
fs.append(f)
return fs
f1, f2, f3 = count()
在上面的例子中,每次迴圈,都建立了一個新的函式,然後,把建立的3個函式都返回了。
你可能認為呼叫f1()
,f2()
和f3()
結果應該是1
,4
,9
,但實際結果是:
>>> f1()
9
>>> f2()
9
>>> f3()
9
廖老師這個例子,讓我很不解為什麼 f1()= 9 ,後來才知道
f1, f2, f3 = count() == f1 = count()[0],f1 = count()[1], f2 = count()[2]
這是一種高階賦值方式,而且僅當 左邊元素個數等於右邊的序列元素個數時可以這麼賦值,學到了學到了,還真是騷操作啊