1. 程式人生 > >Python 高階函式-----閉包

Python 高階函式-----閉包

閉包

什麼是閉包:如果在一個內部函式裡,對在外部作用域(但不是在全域性作用域)的變數進行引用,那麼內部函式就被認為是閉包。

需要滿足的條件

1、一個函式內巢狀一個函式

2、外部函式的返回值必須是這個內部函式

3、內部函式必須使用外部函式中的區域性變數

def fun_1():
    num_1=9
    def fun_2(num_2):
        print(num_1+num_2)
    return fun_2
f=fun_1() #現在f=fun_2
f(8)       #fun_2(8)

輸出  17

這時就稱fun_2為閉包

由於閉包引用了外部函式的區域性變數,則外部函式的區域性變數沒有及時釋放

def fun_2():
    a=list()
    def fun(num):
        a.append(num)
        print(num)
        return a
    return fun
g1=fun_2()
g2=g1(2)
print('****',g2)
g3=g1(3)
print('*****',g3)


輸出結果
2
**** [2]
3
***** [2, 3]

當執行fun_2函式時,變數a被建立。執行g1(2)時,列表a新增一個值2,當執行g2(3)時,列表a又添加了一個值。我們知道一個函式內的區域性變數的生命週期是從執行函式開始到到結束。而現在我們函式已經執行完了,按道理來講區域性變數a應該清除才對。這就是因為閉包的原因,上面也說了閉包使用了外部函式的區域性變數,這就導致區域性變數a一直在記憶體中無法釋放,佔用記憶體。

為什麼使用閉包?

閉包就是為了不懂原函式的程式碼, 還要給他增加新功能的一個手段,通過外面的一層層函式傳遞的引數,讓最內層函式,直接呼叫外層函式的程式碼,增加新的功能。

優點:閉包優化了變數,原來需要類物件完成工作,閉包也可以完成。

缺點:由於閉包引用外部函式的區域性變數,則外部函式的區域性變數,沒有完全釋放,佔用記憶體。