Python中對於閉包函式的理解

2021-10-01 07:39:07 字數 1130 閱讀 5046

閉包的本質還是函式,之所以將它和函式放在一起,是因為閉包首先要滿足函式的巢狀,其次,內部函式必須要對外部函式中的變數有引用,這樣便構成了乙個閉包。

(1)函式巢狀,至少有倆個函式巢狀。多層函式巢狀的話,呼叫變數滿足依賴倒置原則。

(2)內部函式對外部函式中的臨時變數有引用,或者說呼叫。

# a = 2

def outer():

a = 1

def inner():

print(a) #呼叫外部函式中的臨時變數

inner()

outer()

條件的理解:

以上**滿足了構成閉包的條件,如果內部函式沒有呼叫外部函式中的變數a=1,則不算做閉包。同樣,如果內部函式列印的是全域性變數a=2,則也不算做閉包。

當然可以呼叫python內建的特殊函式__closure__來驗證是否是閉包函式,列印 print(inner.closure) ,如果是閉包函式,結果則會有cell的字樣。這也說明了,其實閉包函式就是內函式。

閉包最大的作用就是能夠在函式體外部呼叫內部函式,而實現此作用的關鍵就是 return關鍵字。

def outer():

a = 1 # 使用閉包的好處就是保護了變數a

def inner():

print (a)

return inner # 此處返回的是乙個變數名(記憶體位址)

inn = outer()

inn()

閉包作用理解:

以上**在函式體內部通過return關鍵字將函式名inner返回給呼叫行,存在inn變數中,(注意此處關鍵字return的作用:就是返回給呼叫行)。原本需要在函式內部呼叫inner才能實現內函式inner內部的**,而通過return卻在外部直接呼叫inn()就可以實現inner()內部的**,即print(a)。

所以說閉包函式可以在外部呼叫內部函式。

另外,為什麼上面**說能夠暫保護變數a,因為內當你呼叫函式的時候,便會在你的記憶體裡面開乙個空間,而隨著你**的執行完畢,該空間又會消失,而上面的變數a是在inner的外部,呼叫inn,相當於呼叫inner,卻並不能影響變數a,就是作用域的問題,區域性不可能影響比它範圍大的,當然更不可能影響全域性。

函式閉包python中的閉包

本文純屬個人見解,是對前面學習的總結,如有描述不正確的地方還請高手指正 單簡說,閉包就是根據不同的置配息信到得不同的結果 再來看看專業的解釋 閉包 closure 是詞法閉包 lexical closure 的簡稱,是引用了由自變數的函式。這個被引用的由自變數將和這個函式一起存在,即使已離開了造創它...

對於Python閉包的理解

首先看乙個面試中非常常見的題目 def num return lambda x x i for i in range 4 print n 2 for n in num 先看一下num函式的作用,定義了乙個匿名函式,返回傳入引數乘以列表生成式的每乙個元素,所以乍一看結果應該為 0,2,4,6 如果這樣...

python中函式閉包

閉包 乙個函式巢狀另乙個函式,外面的函式簡稱為外函式,裡面的為內函式,外函式返回內函式。與普通函式不同的是,普通函式呼叫完後,函式中的區域性變數消失,返回記憶體,而閉包外函式呼叫後,外函式的區域性變數沒有消失,而是繼續留給內函式使用。1,普通函式 deffn a 2return a fn print...