python 函數閉包()

來源:互聯網
上載者:User

標籤:int   pre   bsp   函數應用   迴圈   ini   print   code   局部變數   

閉包(closure)

 當一個函數在內部定義函數,並且內部的函數應用外部函數的參數或者局部變數,當內建函式被當做傳回值的時候,相關參數和變數儲存在返回函數中,這種結果,叫閉包

example1:

 1 def test(*args): 2      3     def test_1(): 4         rst = 0 5         for i in args:#這裡使用了函數外部的參數 6             rst += i 7         return rst 8     return test_1#將函數作為傳回值返回,相關參數和變數儲存在返回的函數中 9 10 a = test(1,2,3)11 print(a())

 這上面就是一個常見的閉包

 

閉包也有坑人的地方

example2:

def count():    fs = []    #這裡定義了一個列表    for i in range(1,4):        #定義了一個函數f        #f是一個閉包的結構        def f():            return i*i#這裡不會馬上計算 要返回的時候才會計算        fs.append(f)    return fsf1,f2,f3 = count()print(f1())print(f2())print(f3())# 9# 9# 9# [Finished in 0.2s]# 為什麼會是999呢,造成上述狀況的原因是,返回函數引用了變數i,# 而i並不是立即執行,而是等腰三個函數都返回的時候才統一執行# 此時i已經變成了3,最終調用的時候 返回的都是 3*3# 

上述問題得到結果: 返回閉包時,不能引用任何迴圈變數

解決辦法:

再在外面套一個函數

example3:

def count2():    fs = []    #這裡定義了一個列表    def f(i):#將i作為參數傳入進去        def g():            return i*i#這裡i返回的時候會馬上執行        return g    for i in range(1,4):        fs.append(f(i))    return fsf1,f2,f3 = count2()print(f1())print(f2())print(f3())#1#4#9

 

python 函數閉包()

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.