Python關於 閉包操作

2022-07-05 15:00:25 字數 2562 閱讀 2245

八、閉包的知識點

閉包,又叫做閉包函式、閉合函式,寫法類似函式巢狀。

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閉包,如何定義閉包以及應該如何使用閉包。巢狀函式中的非區域性變數 在進入閉包之前,我們必須先了解乙個巢狀函式和非區域性變數。在函式...