閉包:內部函式對外部函式作用域裡變數的引用(非全域性變數),則稱內部函式為
閉包。
黃色部分,引用了作用域變數,巢狀在某個函式裡面,外部無法直接呼叫,被封閉起來成乙個包。就是閉包。
開始講解,請認真看:
請看以下,我想開啟冰箱,這個步驟只需要一次,然後再放入大象,再放入螞蟻,以下**能完成需求嗎?
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 ...