快速理解閉包

閉包是一個頗有意思的東西,理解起來很繞,可是理解後很簡單,網上的講解也朦朦朧朧的.根據本身的理解解釋一番:python

預備知識:函數中的做用域閉包

python中函數的做用域由def關鍵字界定,函數內的代碼訪問變量的方式是從其所在層級由內向外的.
即函數內使用某變量a,可是該變量在函數內部沒有定義,那麼會去函數外面尋找是否認義該變量a,若沒有繼續往外尋找.

函數外面定義的變量,函數內部能夠讀取使用,可是不能更改,會報錯.
a = 1
def res():
    a = a + 1 #報錯,a是外面的全局變量,函數內部不能改變
    print(a)
res()
可是能夠返回函數內部的局部變量到外面,更改全局變量!
a = 1
def res():
    return a+1
a = res()
print(a) #輸出2,沒有在函數內部改變全局變量a,而是在函數外面改變全局變量a

閉包目的:函數

有一個函數模板(函數中的一個模板參數能夠改變),以下函數B,其模板參數a須要根據須要改變,設定這個函數的模板參數a而避免使用全局變量

def B(x):
    return a * 2 + x

經過類方法實現對一個函數參數的改變code

class define_fun:
    def A(self,a):
        self.a = a
    def B(self,x):
	return 2*self.a + x

DE = define_fun()	#1.引入類
DE.A(3)			#2.經過類方法設定另外一個函數的參數 a
res = DE.B(5)		#3.根據設定的參數,計算結果
print(res)		#輸出11

經過全局變量,實現對一個函數的參數的改變作用域

def A(a):
    return a
def B(x):
    return a * 2 + x

a = A(3)	#1.定義一個變量a
res = B(5)	#2.函數B中沒有設定參數a的值,會自動尋找外層的變量,即全局變量a,而後計算結果
print(res)	#輸出11

經過閉包,實現對一個函數的參數的改變模板

def A1(a):
    def B1(y):
	return 2*a+y
    return B1

funB = A1(3)	#1.直接設定B1函數的模板參數a,返回的是改變模板參數a後的函數B1 (而A1函數內部的變量a會隨該行執行結束而銷燬)
		# 此時的funB應爲函數B1(y),且return 2*3 +y
res = funB(5)	#2.使用設定好參數的B函數,計算結果
print(res)	#輸出11

總之:class

三個方法都會有改變參數後的函數B
可是前面兩個方法都有一個額外變量a/self.a一直存在
而使用閉包時,funB = A1(3)執行完畢後,變量a會隨着做用域(函數A1)的消失而銷燬.比前二者更好

閉包理解:變量

利用外層函數,設定內層函數的模板參數(內層函數是一個靈活的函數,它的模板參數能夠靈活改變)
返回已設定好參數的內層函數供後面使用!

建立閉包函數:引用

閉包函數必須有內嵌函數
內嵌函數須要引用該嵌套函數上一級函數中的變量
閉包函數必須返回內嵌函數

此外:模板參數,爲自創的,哈哈,即函數內部使用卻沒有在函數內部定義的參數方法

相關文章
相關標籤/搜索