1. 程式人生 > 實用技巧 >python學習筆記1 -- 函數語言程式設計之高階函式 使用函式作為返回值

python學習筆記1 -- 函數語言程式設計之高階函式 使用函式作為返回值

使用函式作為返回值,看起來就很高階有木有,前面瞭解過函式名本身就是一個變數,就比如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()結果應該是149,但實際結果是:

>>> f1()
9
>>> f2()
9
>>> f3()
9

廖老師這個例子,讓我很不解為什麼 f1()= 9 ,後來才知道
f1, f2, f3 = count()    ==  f1 = count()[0],f1 = count()[1], f2 = count()[2]

這是一種高階賦值方式,而且僅當 左邊元素個數等於右邊的序列元素個數時可以這麼賦值,學到了學到了,還真是騷操作啊