Python 函數式編程(3) —— 閉包

來源:互聯網
上載者:User

標籤:res   str   font   python   調用   style   bsp   函數返回   append   

內層函數引用了外層函數的變數(參數也算變數),然後返回內層函數的情況,稱為閉包(Closure)。閉包的特點是返回的函數還引用了外層函數的局部變數,所以,要正確使用閉包,就要確保引用的局部變數在函數返回後不能變。

舉例:希望一次返回3個函數,分別計算1x1,2x2,3x3:
def count():
    fs = []
    for i in range(1, 4):
        def f():
            return i*i
        fs.append(f)
    print(fs)
    return fs

f1, f2, f3 = count()
print(f1(), f2(), f3())
# 結果全部都是 9。原因就是當count()函數返回了3個函數時,這3個函數所引用的變數 i 的值已經變成了3。
# 由於f1、f2、f3並沒有被調用,所以,此時他們並未計算 i*i,當 f1 被調用時:9。
# 因此,返回函數不要引用任何迴圈變數,或者後續會發生變化的變數。

返回閉包不能引用迴圈變數,請改寫count()函數,讓它正確返回能計算1x1、2x2、3x3的函數。
def count1():
    fs = []
    for i in range(1, 4):
        def f(j):
            def g():
                return j*j
            return g
        result = f(i)
        fs.append(result)
    print(fs)
    return fs
a1, a2, a3 = count1()
print(a1(), a2(), a3())

 

Python 函數式編程(3) —— 閉包

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.