1. 程式人生 > >Python的閉包

Python的閉包

urn 變量 sta 開始 定義 為什麽 重要 print tro

如果在一個內部函數裏, 對在外部作用域(但不是在全局作用域) 的變量進行引用, 那麽內部函數就被認為是閉包(closure)。定義在外部函數內的但由內部函數引用或者使用的變量被稱為自由變量。

閉包在函數式編程中是一個重要的概念, SchemeHaskell便是函數式編程中兩種。 閉包從語法上看很簡單(和內部函數一樣簡單) 但是仍然很有威力。

那麽為什麽你會想要用閉包?
閉包對於安裝計算、 隱藏狀態和在函數對象和作用域中隨意地切換是很有用的。

閉包在GUI或者在很多API支持回調函數的事件驅動編程中是很有些用處的。 以絕對相同的方式, 應用於獲取數據庫行和處理數
據。 回調就是函數。 閉包也是函數, 但是他們能攜帶一些額外的作用域。 它們僅僅是帶了額外特征的函數……另外的作用域。

閉包和函數調用沒多少相關, 而是關於使用定義在其他作用域的變量。

def counter(start_at=0):
    count=[start_at]
    def incr():
        count[0]+=1
        return count[0]
    return incr;


if __name__=="__main__":
    
    print(counter(0)())

counter()做的唯一一件事就是接受一個初始化的值來開始計數, 並將該值賦給列表count唯一一個成員。 然後定義一個incr()的內部函數。

通過在內部使用變量count, 我們創建了一個閉包, 因為它現在攜帶了整個counter()作用域。 incr()增加了正在運行的count然後返回它。

然後最後的魔法就是counter()返回一個incr, 一個(可調用的) 函數對象。

註意counter(0)(),counter(0)返回的是incr,一個可調用的函數對象,所以後面加()





Python的閉包