Python 高階函式 閉包

2021-08-28 22:17:15 字數 1064 閱讀 4788

閉包

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

需要滿足的條件

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):

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一直在記憶體中無法釋放,占用記憶體。

為什麼使用閉包?

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

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

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

高階函式 閉包

f用於 的格式化,內是變數或函式的某個形參 s這種格式化不行 def func name 小明 print f good morning,func def func name print f good morning,func 小明 分割線 高階函式 引數為函式 閉包 返回值為函式 裝飾器 返回值為...

函式高階(閉包)

def outer func loc list def inner func name print s loc list s name,loc list return inner func clo func 0 outer func clo func 0 clo func 0 clo func 0 ...

2 3 11 Python 函式高階 閉包

閉包的意義 返回的函式物件,不僅僅是乙個函式物件,在該函式外還包裹了一層作用域,這使得,該函式無論在何處呼叫,優先使用自己外層包裹的作用域 說明 關於閉包,即函式定義和函式表示式位於另乙個函式的函式體內 巢狀函式 而且,這些內部函式可以訪問它們所在的外部函式中宣告的所有區域性變數 引數。當其中乙個這...