閉包是一個頗有意思的東西,理解起來很繞,可是理解後很簡單,網上的講解也朦朦朧朧的.根據本身的理解解釋一番: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)的消失而銷燬.比前二者更好
閉包理解:變量
利用外層函數,設定內層函數的模板參數(內層函數是一個靈活的函數,它的模板參數能夠靈活改變) 返回已設定好參數的內層函數供後面使用!
建立閉包函數:引用
閉包函數必須有內嵌函數 內嵌函數須要引用該嵌套函數上一級函數中的變量 閉包函數必須返回內嵌函數
此外:模板參數,爲自創的,哈哈,即函數內部使用卻沒有在函數內部定義的參數方法