詳解 Python中LEGB和閉包及裝飾器
LEGB L>E>G?B
- L:local函數內部作用域
- E:enclosing函數內部與內嵌函數之間
- G:global全局作用域
- B:build-in內置作用域
python 閉包
1.Closure:內部函數中對enclosing作用域變量的引用
2.函數實質與屬性
- 函數是一個對象
- 函數執行完成后內部變量回收
- 函數屬性
-
函數返回值
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:內部函數中對enclosing作用域變量的引用,它會將enclosing作用域變量傳遞到內部函數的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函數中的__closure__中,所以可以調用
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函數,會先執行參數類型判斷,然后執行__closure__中的函數my_sum
python 裝飾器
- 裝飾器用來裝飾函數
- 返回一個函數對象
- 被裝飾函數標識符指向返回的函數對象
-
語法糖 @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函數中的__closure__中,所以可以調用
return in_dec # 如果沒有返回值,則my_sum調用裝飾器后為None
# my_sum = dec(my_sum) # 不手動傳參
@dec # 裝飾器將my_sum作為參數傳入dec,并返回一個新的函數賦值給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和閉包及裝飾器的介紹,如有疑問請留言或者到本站社區交流討論,本站關于Python 的文章還有很多,還希望大家搜索查閱,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

