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]
分类:
Tech / Python
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?