詳解 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ù)實質(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中
閉包的作用:
- 封裝
- 代碼復用
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ù)標識符指向返回的函數(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 的文章還有很多,還希望大家搜索查閱,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
Pycharm中配置Jupyter環(huán)境的圖文教程
本文主要介紹了Pycharm中配置Jupyter環(huán)境的圖文教程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-07-07
python實現(xiàn)將一維列表轉(zhuǎn)換為多維列表(numpy+reshape)
今天小編就為大家分享一篇python實現(xiàn)將一維列表轉(zhuǎn)換為多維列表(numpy+reshape),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11
python使用協(xié)程實現(xiàn)并發(fā)操作的方法詳解
這篇文章主要介紹了python使用協(xié)程實現(xiàn)并發(fā)操作的方法,結(jié)合實例形式詳細分析了Python協(xié)程的原理及使用Gevent實現(xiàn)協(xié)程操作的相關(guān)技巧與操作注意事項,需要的朋友可以參考下2019-12-12
在Sublime Editor中配置Python環(huán)境的詳細教程
這篇文章主要介紹在sublime編輯器中安裝python軟件包,以 實現(xiàn)自動完成等功能,并在sublime編輯器本身中運行build,本文通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧2020-05-05
Python 使用 PyMysql、DBUtils 創(chuàng)建連接池提升性能
DBUtils 是一套 Python 數(shù)據(jù)庫連接池包,并允許對非線程安全的數(shù)據(jù)庫接口進行線程安全包裝。這篇文章主要介紹了Python 使用 PyMysql、DBUtils 創(chuàng)建連接池,提升性能,需要的朋友可以參考下2019-08-08

