八、閉包的知識點
閉包,又叫做閉包函式、閉合函式,寫法類似函式巢狀。
8.1 閉包的基本操作
從複雜的概念中抽離出來,在 python 中,閉包就是你呼叫乙個函式 x,這個函式返回乙個 y 函式給你,這個返回的函式 y 就是閉包。
掌握任何技術前,都要先看一下最基本的案例**:
def func(parmas):
# 內部函式
def inner_func(p):
print(f"外部函式引數,內部函式引數")
return inner_func
inner = func("外")
inner("內")
對上述**的說明如下,在呼叫 func("外") 的時候產生了乙個閉包 inner_func 函式,該閉包函式內呼叫了外部函式 func 的引數 parmas,此時的 parmas 引數被稱為自由變數(概念性名詞,了解即可)。當函式 func 的宣告週期結束後,parmas 這個變數依然存在,原因就是被閉包函式 inner_func 呼叫了,所以不會被**。
再次對上文**進行注釋,幫助你理解閉包函式的實現。
# 定義外部(外層)函式
def func(parmas):
# 定義內部(內層)函式
def inner_func(p):
print(f"外部函式引數,內部函式引數")
# 一定要返回內層函式
return inner_func
# 呼叫外層函式,賦值給乙個新變數 inner,此時的 inner 相當於內層函式,並且保留了自由變數 params
inner = func("外")
inner("內")
總結下來,實現乙個閉包需要以下幾步:
必須有乙個內層函式 ;
內層函式必須使用外層函式的變數,不使用外層函式的變數,閉包毫無意義;
外層函式的返回值必須是內層函式。
8.2 閉包作用域
先看**:
def outer_func():
my_list =
def inner_func(x):
print(f"-my_list:")
return inner_func
test1 = outer_func()
test1("i1")
test1("i1")
test1("i1")
test1("i1")
test2 = outer_func()
test2("i2")
test2("i2")
test2("i2")
test2("i2")
上述**中的自由變數 my_list 的作用域,只跟每次呼叫外層函式,生成的變數有關,閉包每個例項引用的變數互相不存在干擾。
8.3 閉包的作用
再上文中,你是否已經對閉包的作用有初步了解了?
接下來再強調一下,閉包操作中會涉及作用域相關問題,最終實現的目標是脫離了函式本身的作用範圍,區域性變數還可以被訪問到。
def outer_func():
msg = "夢想橡皮擦"
def inner_func():
print(msg)
return inner_func
outer = outer_func()
outer()大連做**多少錢
如果你對滾雪球第一遍還有印象,會了解到區域性變數僅在函式的執行期間可用,也就說 outer_func 函式執行過之後,msg 變數就不可用了,但是上面執行了 outer_func 之後,再呼叫 outer 的時候,msg 變數也被輸出了,這就是閉包的作用,閉包實現了區域性變數可以在函式外部訪問。
相應的理論再擴充套件一下,就是在該種情況下可以把區域性變數當做全域性變數用。
最後再備註一句,說明一下閉包的作用吧:閉包,儲存了一些非全域性變數,即儲存區域性資訊不被銷毀。
8.4 判斷閉包函式
通過 函式名.__closure__ 判斷乙個函式是否是閉包函式。
def outer_func():
msg = "夢想橡皮擦"
def inner_func():
print(msg)
return inner_func
outer = outer_func()
outer()
print(outer.__closure__)
返回的元組中,第一項是 cell 即為閉包函式。
8.5 閉包存在的問題
這個問題是位址和值的問題,是作業系統底層原理導致的問題,具體實現先看**,乙個非常經典的案例。
def count():
fs =
for i in range(1, 4):
def f():
return i
return fs
f1, f2, f3 = count()
print(f1())
print(f2())
print(f3())
上述**不是簡單的返回了乙個閉包函式,而是返回的乙個包含三個閉包函式的序列 list。
本案例你記住下面這句話也可。
盡量避免在閉包中引用迴圈變數,或者後續會發生變化的變數。
python 閉包 python 閉包
閉包 因為python中函式也可以當作物件,所以如果出現當我們返回乙個函式,而該函式含有外部變數的時候就形成了閉包。閉包的特點 是個巢狀函式 可以獲得非區域性的變數 將函式當作物件返回 看乙個例子會更易理解 def make printer msg msg hi there def printer ...
python怎麼閉包 Python閉包
python閉包教程 閉包就是乙個 在閉包的記憶功能 在 python 中,獲到閉包中的變數讓閉包本身擁有了記憶效應,閉包中的邏輯可以修改閉包捕獲的變數,變數會跟隨閉包生命期一直存在,閉包本身就如同變數一樣擁有了記憶功能。python閉包定義詳解 語法def func param def func ...
python閉包技巧 Python閉包
本篇文章幫大家學習python閉包,包含了python閉包使用方法 操作技巧 例項演示和注意事項,有一定的學習價值,大家可以用來參考。在本文中,您將了解什麼是python閉包,如何定義閉包以及應該如何使用閉包。巢狀函式中的非區域性變數 在進入閉包之前,我們必須先了解乙個巢狀函式和非區域性變數。在函式...