詳解 Python中LEGB和閉包及裝飾器
LEGB L>E>G?B
- L:local函數(shù)內(nèi)部作用域
- E:enclosing函數(shù)內(nèi)部與內(nèi)嵌函數(shù)之間
- G:global全局作用域
- B:build-in內(nèi)置作用域
python 閉包
1.Closure:內(nèi)部函數(shù)中對(duì)enclosing作用域變量的引用
2.函數(shù)實(shí)質(zhì)與屬性
- 函數(shù)是一個(gè)對(duì)象
- 函數(shù)執(zhí)行完成后內(nèi)部變量回收
- 函數(shù)屬性
-
函數(shù)返回值
passline = 60 def func(val): if val >= passline: print ('pass') else: print ('failed') def in_func(): print (val) in_func() return in_func f = func(89) f() print (f.__closure__)
一般情況
def f_100(val): passline = 60 if val >= passline: print ('pass') else: print ('failed') def f_150(val): passline = 90 if val >= passline: print ('pass') else: print ('failed') f_100(89) f_150(89)
閉包
def set_passline(passline): def cmp(val): if val >= passline: print ('Pass') else: print ('failed') return cmp f_100 = set_passline(60) f_150 = set_passline(90) f_100(89) f_150(89)
Closure:內(nèi)部函數(shù)中對(duì)enclosing作用域變量的引用,它會(huì)將enclosing作用域變量傳遞到內(nèi)部函數(shù)的closure中
閉包的作用:
- 封裝
-
代碼復(fù)用
python閉包二
求和
def my_sum(*arg): if len(arg) == 0: return 0 for val in arg: if not isinstance(val,int): # 有一個(gè)非int則返回0 return 0 return sum(arg) def my_average(*arg): if len(arg) == 0: return 0 for val in arg: if not isinstance(val,int): # 有一個(gè)非int則返回0 return 0 return sum(arg)/len(arg) print (my_sum(1,2,3,4,5)) print (my_sum(1,2,3,4,5,'6')) print (my_aveage(1,2,3,4,5)) print(my_average())
閉包的使用
def my_sum(*arg): return sum(arg) def my_average(*arg): return sum(arg)/len(arg) def dec(func): def in_dec(*arg): # my_sum print ('in dec arg= ',arg) if len(arg) ==0: return 0 for val in arg: if not isinstance(val, int): return 0 return func(*arg) # 閉包,存在于in_dec函數(shù)中的__closure__中,所以可以調(diào)用 return in_dec my_sum = dec(my_sum) # 傳參 print(my_sum (1,2,3,4,5)) print(my_sum (1,2,3,4,5,'6')) # my_sum就是in_dec函數(shù),會(huì)先執(zhí)行參數(shù)類型判斷,然后執(zhí)行__closure__中的函數(shù)my_sum
python 裝飾器
- 裝飾器用來裝飾函數(shù)
- 返回一個(gè)函數(shù)對(duì)象
- 被裝飾函數(shù)標(biāo)識(shí)符指向返回的函數(shù)對(duì)象
-
語法糖 @deco
使用裝飾器的方式
def dec(func): def in_dec(*arg): # my_sum print ('in dec arg= ',arg) if len(arg) ==0: return 0 for val in arg: if not isinstance(val, int): return 0 return func(*arg) # 閉包,存在于in_dec函數(shù)中的__closure__中,所以可以調(diào)用 return in_dec # 如果沒有返回值,則my_sum調(diào)用裝飾器后為None # my_sum = dec(my_sum) # 不手動(dòng)傳參 @dec # 裝飾器將my_sum作為參數(shù)傳入dec,并返回一個(gè)新的函數(shù)賦值給my_sum def my_sum(*arg): return sum(arg) def my_average(*arg): return sum(arg)/len(arg) print(my_sum (1,2,3,4,5)) print(my_sum (1,2,3,4,5,'6'))
另一個(gè)例子
def deco(func): def in_deco(x,y): print ('in deco') func(x,y) print ('call deco') return in_deco @deco def bar(x, y): print ('in bar',x+y) bar(1,2)
以上就是Python中LEGB和閉包及裝飾器的介紹,如有疑問請(qǐng)留言或者到本站社區(qū)交流討論,本站關(guān)于Python 的文章還有很多,還希望大家搜索查閱,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
