python装饰器之函数作用域
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') def in_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]