詳解 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ù)中對enclosing作用域變量的引用
2.函數(shù)實質(zhì)與屬性
- 函數(shù)是一個對象
- 函數(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ù)中對enclosing作用域變量的引用,它會將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): # 有一個非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): # 有一個非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ù),會先執(zhí)行參數(shù)類型判斷,然后執(zhí)行__closure__中的函數(shù)my_sum
python 裝飾器
- 裝飾器用來裝飾函數(shù)
- 返回一個函數(shù)對象
- 被裝飾函數(shù)標(biāo)識符指向返回的函數(shù)對象
-
語法糖 @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) # 不手動傳參 @dec # 裝飾器將my_sum作為參數(shù)傳入dec,并返回一個新的函數(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'))
另一個例子
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ū)交流討論,本站關(guān)于Python 的文章還有很多,還希望大家搜索查閱,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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