每日計(jì)劃:2017.05.21
<思維導(dǎo)圖>
</br>
概念
維基百科是這樣說的:
閉包:英語Closure兄世,又稱詞法閉包(Lexical Closure)或函數(shù)閉包(function closures)辫继,是引用了自由變量的函數(shù)蛋褥。這個被引用的自由變量將和這個函數(shù)一同存在冶匹,即使離開了創(chuàng)造它的環(huán)境也不例外。所以有另一種說法認(rèn)為閉包 是由函數(shù)和與其相關(guān)的引用環(huán)境組合而成的實(shí)體橡庞。閉包在運(yùn)行時(shí)可以有多個實(shí)例荸频,不同的引用環(huán)境和相同的函數(shù)組合可以產(chǎn)生不同的實(shí)例。
自由變量:定義在外部函數(shù)內(nèi)疚宇,但是由內(nèi)部函數(shù)引用(或使用)的變量
簡單的說亡鼠,是在一個函數(shù)A中,定義另一個函數(shù)B敷待,這個B函數(shù)就是閉包间涵,調(diào)用A函數(shù)當(dāng)中傳遞的參數(shù)就是自由變量
舉例:
def func1():
a=1
def func2()
print var
return func2 # python可以返回一個函數(shù)
</br>
</br>
閉包特點(diǎn)和作用
1、閉包的詞法變量 既不屬于全局名稱空間榜揖,也不屬于局部名稱空間勾哩。與對象不同,對象存活在一個對象的名稱空間举哟,但是閉包變量存活在一個 函數(shù) 的名稱空間和作用域思劳。
2、閉包引用的自由變量將與函數(shù)一同存在妨猩,即使離開了創(chuàng)作它的環(huán)境也不例外潜叛,可以用來保護(hù)或隱藏一個變量,不會在調(diào)用后被垃圾回收機(jī)制(garbage collection)回收
3、閉包和類等有些類似钠导,皆是對代碼進(jìn)行了一些封裝震嫉,提高代碼的可復(fù)用性
4、閉包可用于間接訪問一個變量牡属,但是不能修改外部環(huán)境的局部變量
5票堵、閉包不會造成內(nèi)存泄露
6、閉包有利于并行運(yùn)算
def func1():
a=1
def func2():
a=8
print a
print a
func2()
print a
#結(jié)果輸出
1
8
1
</br>
一個常見的錯誤代碼
def func1():
var=1
def func2():
var=var+1
print var
retrun var
return func2()
func1()
#結(jié)果輸出
......
UnboundLocalError: local variable 'var' referenced before assignment
</br>
前面的命名空間和作用域部分已經(jīng)講過類似的逮栅,python默認(rèn)函數(shù)中=賦值語句左邊皆為局部變量悴势。例子中func2()函數(shù)則認(rèn)定var=var+1左邊的var為局部變量,然后接著找右邊的var措伐,但是找不到var具體值特纤,于是報(bào)錯。
解決方法就是 將a設(shè)置為一個容器侥加。
def func1():
var=[1]
def func2():
var[0]=var[0]+1
print var[0]
return var[0]
func2()
func1()
#結(jié)果輸出
<function func2 at 0x0000000002A81B38>
不過這樣還是顯得麻煩捧存,python3中可以使用nonlocal a,聲明a不是閉包中的局部變量
</br>
閉包應(yīng)用實(shí)例
還沒寫完担败,先去上課