python閉包
閉包的條件
1.閉包函式必須返回乙個函式物件
2.閉包函式內部的函式必須引用外部的函式的變數,(一般不能引用全域性的變數),裡面函式的返回值可有可無
閉包格式
def 外層函式(引數):
def 內層函式():
print("內層函式執行", 引數)
return 內層函式
內層函式的引用 = 外層函式("傳入引數")
內層函式的引用()
__closure__檢視閉包引用的外部函式作用域的值
首先是乙個元組
def zx():
a=1b=2
def inner(z):
print(a+b+z)
return inner
wl = zx()
print(wl.__closure__.__class__)
print(wl.__closure__)
for i in wl.__closure__:
print(i.cell_contents)
process finished with exit code 0
注意1.內部函式如果不引用外部函式的值,那麼__closure__一直為none
2.如果主函式沒有返回子函式,那麼沒有__closure__屬性
閉包的意義
1.返回的函式物件,不僅僅是乙個函式物件,這個物件外部還包裹著一層作用域,可以在這層作用域中放入想要的引數,這樣就可以使函式物件無論什麼時候優先使用這層作用域中的值,有遮蔽全域性作用域的作用
2.外部無法訪問巢狀函式內部的變數,只能靠函式返回的物件,在能訪問這些變數
閉包案例
從例子中可以看出,函式無法儲存for產生的臨時變數,最後都指向最後乙個,如果有需求要儲存臨時變數怎麼解決呢?這個時候就需要用到閉包了
lis =
for i in range(3):
def zx(a):
return a+i
for f in lis:
print(f(2))
使用閉包,就可以儲存for產生的臨時變數,儲存到函式的區域性作用域中
lis =
for i in range(3):
def zx(i):
def inner(a):
return a+i
return inner
for f in lis:
print(f(2))
閉包的應用
1.裝飾器
def login_auth(func):
def inner(*args,**kwargs):
#業務邏輯
res = func(*args,**kwargs)
return res
return inner
2.爬蟲
3.閉包可以儲存執行環境
def zx(a):
def inner():
print(a)
return inner
wl = zx(10)
a=100
wl()
閉包的實際案例
def who(name):
def do(what):
print(name,'說:',what)
return do
zx = who('zx')
wl = who('wl')
zx('吃飯去啊')
wl('好啊')
zx 說: 吃飯去啊
wl 說: 好啊
參考鏈結
python 閉包 python 閉包
閉包 因為python中函式也可以當作物件,所以如果出現當我們返回乙個函式,而該函式含有外部變數的時候就形成了閉包。閉包的特點 是個巢狀函式 可以獲得非區域性的變數 將函式當作物件返回 看乙個例子會更易理解 def make printer msg msg hi there def printer ...
python怎麼閉包 python的閉包
一 思考乙個問題 我們要給定乙個x,要求一條直線上x對應的y的值。公式是y kx b。我們需要用k,b來確定這條直線,則我們實現的函式應該有3個引數 defline k,b,x print k x b line 1,3,4 line 1,3,5 line 1,3,6 可以看到,我們每次修改x都要重新...
python 閉包 Python中的閉包
一 什麼是閉包 在談之前,我們先來說說作用域,變數的作用域無非就兩種 全域性變數和區域性變數。函式內部可以直接讀取全域性變數,但是在函式外部無法讀取函式內部的區域性變數。出於種種原因,我們有時候需要獲取到函式內部的區域性變數。但是,正常情況下,這是辦不到的!只有通過變通的方法才能實現。於是就引入了閉...