詳解 Python中LEGB和閉包及裝飾器
詳解 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ù)實(shí)質(zhì)與屬性
- 函數(shù)是一個(gè)對象
- 函數(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作用域變量的引用,它會(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ù)對象
- 被裝飾函數(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) # 不手動(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ū)交流討論,本站關(guān)于Python 的文章還有很多,還希望大家搜索查閱,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
詳解Python計(jì)算機(jī)視覺 圖像扭曲(仿射扭曲)
這篇文章主要介紹了Python計(jì)算機(jī)視覺 圖像扭曲(仿射扭曲),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03python 實(shí)現(xiàn)mysql增刪查改示例代碼
python中可以通過pymysql實(shí)現(xiàn)MySQL數(shù)據(jù)庫的連接,并實(shí)現(xiàn)數(shù)據(jù)庫的各種操作,這篇文章主要給大家介紹了關(guān)于pymsql實(shí)現(xiàn)增刪改查的示例代碼,需要的朋友可以參考下2021-11-11Pycharm中配置Jupyter環(huán)境的圖文教程
本文主要介紹了Pycharm中配置Jupyter環(huán)境的圖文教程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07python實(shí)現(xiàn)將一維列表轉(zhuǎn)換為多維列表(numpy+reshape)
今天小編就為大家分享一篇python實(shí)現(xiàn)將一維列表轉(zhuǎn)換為多維列表(numpy+reshape),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11python使用協(xié)程實(shí)現(xiàn)并發(fā)操作的方法詳解
這篇文章主要介紹了python使用協(xié)程實(shí)現(xiàn)并發(fā)操作的方法,結(jié)合實(shí)例形式詳細(xì)分析了Python協(xié)程的原理及使用Gevent實(shí)現(xiàn)協(xié)程操作的相關(guān)技巧與操作注意事項(xiàng),需要的朋友可以參考下2019-12-12在Sublime Editor中配置Python環(huán)境的詳細(xì)教程
這篇文章主要介紹在sublime編輯器中安裝python軟件包,以 實(shí)現(xiàn)自動(dòng)完成等功能,并在sublime編輯器本身中運(yùn)行build,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2020-05-05Python 使用 PyMysql、DBUtils 創(chuàng)建連接池提升性能
DBUtils 是一套 Python 數(shù)據(jù)庫連接池包,并允許對非線程安全的數(shù)據(jù)庫接口進(jìn)行線程安全包裝。這篇文章主要介紹了Python 使用 PyMysql、DBUtils 創(chuàng)建連接池,提升性能,需要的朋友可以參考下2019-08-08