閉包是乙個難學的概念,首先要搞清楚為什麼需要閉包?其實閉包的出現往往是函式式程式設計的語言裡,在物件導向的程式語言裡是可以不需要閉包的。因為閉包作用如下:
1. 避免使用全域性變數,實現資料隱藏和保持,也就是物件導向的特性:封裝。
2. 當成員變數比較少,以及方法只有乙個時,比類更簡單實現。
3. 資料和函式一起封裝,適應非同步或併發執行。
什麼時候定義了乙個閉包
當在乙個函式裡巢狀定義乙個函式時,就會產生乙個閉包,因此定義乙個閉包需要下面幾個條件:
1. 巢狀函式定義(函式內定義函式)。
2. 最內層巢狀函式訪問函式外的區域性變數。
3. 函式返回內巢狀函式物件。
如下面例子:
#python 3.6
def add_conf():
b = 10
def add(x):
return x + b
b = 1
return add
#my_conf = add_conf()
print(my_conf(1))
輸出結果如下:
2又或者如下面的例子:
def make_multiplier_of(n):
def multiplier(x):
return x * n
return multiplier
# multiplier of 3
times3 = make_multiplier_of(3)
# multiplier of 5
times5 = make_multiplier_of(5)
# output: 27
print(times3(9))
# output: 15
print(times5(3))
# output: 30
print(times5(times3(2)))
結果輸出如下:
2715
30從上面這個例子裡,可以看到區域性變數n會儲存起來,並且在這裡並沒有使用全域性變數,就可以達到這個目標,並且資料也可以隱藏起來。
在python裡可以通過__closure__來檢視閉包時儲存的環境變數的值,如下例子:
def make_multiplier_of(n):
def multiplier(x):
return x * n
return multiplier
# multiplier of 3
times3 = make_multiplier_of(3)
# multiplier of 5
times5 = make_multiplier_of(5)
# output: 27
print(times3(9))
# output: 15
print(times5(3))
# output: 30
print(times5(times3(2)))
print(times3.__closure__[0].cell_contents)
print(times5.__closure__[0].cell_contents)
結果輸出如下:
2715303
5
什麼是「閉包」(closure)為什麼要用它?
什麼是閉包 閉包是指有權訪問另乙個函式作用域中變數的函式,建立閉包的最常見的方式就是在乙個函式內建立另乙個函式,通過另乙個函式訪問這個函式的區域性變數,利用閉包可以突破作用鏈域,將函式內部的變數和方法傳遞到外部。閉包的特性 1.函式內再巢狀函式 2.內部函式可以引用外層的引數和變數 3.引數和變數不...
什麼是閉包?為什麼使用閉包?閉包的缺點?
閉包 即重用乙個變數,又保護變數不被汙染的一種機制。為什麼使用閉包 全域性變數和區域性變數都具有不可兼得的優缺點。全域性變數 優 可重用,缺 易被汙染。區域性變數 優 僅函式內可用,不會被汙染。缺 不可重用 何時使用 只要即重用乙個變數,又保護變數不被汙染時。如何 3步 1.用外層函式包裹要保護的變...
閉包 Closure 和匿名函式
閉包是由函式與其相關的引用環境組合而成的實體.通俗來講就是 在乙個內部函式裡,對在外部作用域 但不是全域性作用域 的變數進行引用,那麼內部函式就被認為是閉包 closure 看個例子 deffuna x deffunb y return x y return funb funa 0x7fdfad04...