python3 理解閉包

2021-10-23 01:52:49 字數 2857 閱讀 3821

閉包:內部函式對外部函式作用域裡變數的引用(非全域性變數),則稱內部函式為

閉包。

黃色部分,引用了作用域變數,巢狀在某個函式裡面,外部無法直接呼叫,被封閉起來成乙個包。就是閉包。

開始講解,請認真看:

請看以下,我想開啟冰箱,這個步驟只需要一次,然後再放入大象,再放入螞蟻,以下**能完成需求嗎?

def openbox(fn):

print('開啟冰箱')

fn()

def foo():

print("放入大象")

def foo2():

print("放入螞蟻")

xx=openbox(foo)

yy=openbox(foo2)

執行結果:

開啟冰箱

放入大象

開啟冰箱

放入螞蟻

很明顯這**滿足不了需求!

怎麼實現開啟冰箱只需一次呢?以後想再加東西,我都不需要修改原來開啟冰箱的**。怎麼實現?

這時候就可以用到閉包函式了。。把新的功能指向乙個變數,然後做成閉包,就可以累計功能了。我每次只要想用,我就取閉包的值。閉包外的**壓根就不影響。而且不影響原來的功能。看**:

def openbox():

print("開啟冰箱")

def in_func(animal):

animal()

return in_func #返回的指向是內函式體

def foo():

print("放入大象")

def foo2():

print("放入螞蟻")

def foo3():

print("放入長頸鹿")

action=openbox() #這個只需要一次

action(foo)

action(foo2)

action(foo3)

執行結果:

開啟冰箱

放入大象

放入螞蟻

放入長頸鹿

解釋:

action(foo) 這語句就類似 in_func(foo) 加上foo() ,一句話就搞定實現執行2句話

接下來,看看閉包執行的順序:

def out_function(num):

print('---1---')

def in_function():

print(num+100)

print('---2---')

print('---3---')

return in_function

out_function(100)

執行結果:

---1---

---3---

以上只是執行了外殼,因為沒有執行指向閉包的函式體,閉包部分**就沒執行。 。**:

橙色部分不執行,是因為僅僅定義函式。只要非呼叫,定義函式是不會執行結果的。那你return in_function這句話怎麼解釋呢,這句話僅僅只是表示「返回引用的物件,即內部的函式體」

接下來執行閉包部分:

def out_function(num):

print('---1---')

def in_function():

print(num+100)

print('---2---')

print('---3---')

return in_function

in_result=out_function(100)

in_result()

執行結果:

---1---

---3---

200---2---

解釋,這個執行順序不言而喻了吧。,**:

箭頭1:得到了內部的函式體

箭頭2:把得到的結果用in_result 變數儲存了,嚴格來說是in_result指向了內部函式體的引用

in_result() 表示 呼叫內部函式,就好比out_function(100)()  ,把out_function(100)看成個整體

給內部函式傳參:

def out_function(num):

def in_function(num2):

print(num+num2)

return in_function

in_result=out_function(100)

in_result(100)

in_result(200)

in_result(300)

執行結果:

200300

400 

接下來做個練習,看看理解沒,現在需要求公式  y=ax + b  ,求y的值

答案下拉,不許偷看答案哦

答案:

def my_count(a,b):

def in_func(x):

y=a*x + b

print(y)

return in_func

count=my_count(2,1)

count(1)

count(4)

count(3)

python3 閉包 第九天python3 閉包

自由變數 未在本地作用域中定義的變數,例如定義在記憶體函式外的外層函式的作用域中的變數 閉包 出現在巢狀函式中,指的是內層函式引用到了外層函式的自由變數,就形成了閉包 示例1 解析 第四行不會報錯,c已經在counter函式中定義過了,而且inc中的使用方式是為c的元素修改值,而不是重新定義 第八行...

python閉包怎麼理解 Python 閉包的理解

很多函式型的語言都有閉包這一概念,比如python的兄弟js。人們剛聽到閉包這一概念總會覺得它很晦澀,難以理解。其實不然,主要是他的名字起得太抽象了,讓人誤以為很難。下面舉乙個例子 coding utf 8 def foo nums 0 5 for i in range 5 nums i lambd...

Python3 閉包及裝飾器

一.什麼是閉包 不同程式語言實現閉包的方式是不同的,python中閉包從表現形式上看,如果在乙個內部函式裡,對在外部作用域 但不是在全域性作用域 的變數進行引用,那麼內部函式就被認為是閉包 closure 舉個例子 def outer x def inner y return x y return ...