python閉包小例子

weixin_34377065發表於2013-10-29

------------------

首先根據例項, 體會一下閉包的效果

------------------

      

定義閉包:

def foo(x):  

    a = [0]  

    def bar(y):  

        a[0] = a[0]*x + y

        print(a[0])        

        return a[0]

        

    return bar  

    

    

使用閉包

f=foo(1)

f(2) #print 2

f(2) #print 4

f(2) #print 6

 

 

------------------

閉包要達到的目的

------------------

普通函式, 輸入給定後, 輸出總是一定的, 比如add(1,2), 無論呼叫多少次, 結果永遠是3。

閉包則不同, 在函式在執行後, 有能力保持函式執行後的環境, 為下次閉包的執行營造一個新的環境. 

典型的為了閉包而閉包的情形有:

1. 看起來像閉包, 實際上並不具持久化的程式碼,. 

2. 看起來像閉包, 實際上卻使用了global變數來支援持久化. 

 

------------------

閉包的意義

------------------

一句話,類是包含行為的資料,閉包是有資料的行為。一般情況下,我們完全可以使用全域性變數+函式來實現持久化,或者寫個類,可讀性比閉包好多了。

閉包的作用, 摘自http://www.gracecode.com/posts/2385.html

    setTimeout/setInterval

    回撥函式(callback)

    事件控制程式碼(event handle)

 

------------------

閉包模板

------------------

##閉包的定義模板

def foo(x):   

    a = [0]                 #宣告一個local變數來支援持久化, 因為python2不支援nonlocal, 所以這裡用了list, 而不是a=0

    def bar(y):

a[0] = a[0]*x + y   #修改local變數的值, 因為python2不支援nonlocal, 所以賦值給了a[0]而不是a

        print(a[0])         

        return a[0]         #內部函式一定要返回持久化變數, 這裡可返回a[0]或a

        

    return bar              #外部函式一定是返回內部函式

    

 

##閉包的使用模板

f=foo(1)  #定義一個閉包, 就像例項化一個類一樣, 引數要符合外部函式簽名

f(2)      #執行閉包, 就像呼叫某個函式一樣, 引數要符合內部函式簽名

 

相關文章