為什麼要使用閉包(closures)

2021-08-08 16:41:46 字數 1651 閱讀 5187

閉包是乙個難學的概念,首先要搞清楚為什麼需要閉包?其實閉包的出現往往是函式式程式設計的語言裡,在物件導向的程式語言裡是可以不需要閉包的。因為閉包作用如下:

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...