python裝飾器之函數作用域
阿新 • • 發佈:2018-07-31
div 函數對象 內置 代碼復用 urn func -i fail 代碼
1.函數作用域LEGB
L:local函數內部作用域
E:enclosing函數內部與內嵌函數之間
G:global全局作用域
B:build-in內置作用域
passline = 60 def func(val): passline = 90 if val >= passline: print(‘pass‘) else: print(‘failed‘) def in_func() print(val) in_func() def Max(val1,val2): return max(val1,val2) func(89) print(Max(90,100))
2.閉包理解與使用
閉包概念:Closure:內部函數中對enclosing作用域的變量進行引用
函數實質與屬性
1:函數是一個對象
2:函數執行完成後內部變量回收
3:函數屬性
4:函數返回值
閉包作用
1:封裝
2:代碼復用
passline = 60#100 def func(val): print(‘%x‘%id(val)) passline = 90 if val >= passline: print(‘pass‘) else: print(‘failed‘) defin_func():#(val,) print(val) in_func() return in_func f = func(89) f() print(f.__closure__)
29198a8 failed 89 89 (<cell at 0x7fe62bbf42f0: int object at 0x29198a8>,) [Finished in 0.0s]
def func_150(val): passline = 90 if val >= passline: print(‘%d pass‘%val)else: print(‘failed‘) def func_100(val): passline = 60 if val >= passline: print(‘%d pass‘%val) else: print(‘failed‘) 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) print(type(f_100)) print(f_100.__closure__) f_100(89) f_100(59) f_150(89) f_150(59)
pass failed failed failed [Finished in 0.0s]
def my_averge(*arg): print(‘in my_averge‘) return sum(arg)/len(arg) def my_sum(*arg): print(‘in my_sum‘) return sum(arg) def dec(func): def in_dec(*arg): 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) return in_dec #dec return in_dec -> my_sum #my_sum = in_dec(*arg) my_sum = dec(my_sum) print(my_sum(1, 2, 3, 4, 5)) print(my_sum(1, 2, 3, 4, 5, ‘6‘)) print(my_averge(1, 2, 3, 4, 5)) my_averge = dec(my_averge) print(my_averge(1, 2, 3, 4, 5, ‘6‘))
(‘in dec arg = ‘, (1, 2, 3, 4, 5)) in my_sum 15 (‘in dec arg = ‘, (1, 2, 3, 4, 5, ‘6‘)) 0 in my_averge 3 (‘in dec arg = ‘, (1, 2, 3, 4, 5, ‘6‘)) 0 [Finished in 0.0s]
3.裝飾器
1:裝飾器用來裝飾函數
2:返回一個函數對象
3:被裝飾函數標識符指向返回的函數對象
4:語法糖 @deco
def dec(func): print(‘call dec‘) 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) return in_dec @dec def my_sum(*arg):#my_sum = in_dec print(‘in my_sum‘) return sum(arg) print(my_sum(1, 2, 3, 4, 5)) #my_sum = dec(my_sum) #deco(bar) -> in_deco #bar = in_deco #bar() in_deco() bar() 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) print(type(bar)) bar(1,2)
call dec (‘in dec arg = ‘, (1, 2, 3, 4, 5)) in my_sum 15 call deco <type ‘function‘> in deco (‘in bar‘, 3) [Finished in 0.0s]
python裝飾器之函數作用域