详解 Python中LEGB和闭包及装饰器
详解Python中LEGB和闭包及装饰器
LEGBL>E>G?B
- L:local函数内部作用域
- E:enclosing函数内部与内嵌函数之间
- G:global全局作用域
- B:build-in内置作用域
python闭包
1.Closure:内部函数中对enclosing作用域变量的引用
2.函数实质与属性
- 函数是一个对象
- 函数执行完成后内部变量回收
- 函数属性
- 函数返回值
passline=60 deffunc(val): ifval>=passline: print('pass') else: print('failed') defin_func(): print(val) in_func() returnin_func f=func(89) f() print(f.__closure__)
一般情况
deff_100(val): passline=60 ifval>=passline: print('pass') else: print('failed') deff_150(val): passline=90 ifval>=passline: print('pass') else: print('failed') f_100(89) f_150(89)
闭包
defset_passline(passline): defcmp(val): ifval>=passline: print('Pass') else: print('failed') returncmp f_100=set_passline(60) f_150=set_passline(90) f_100(89) f_150(89)
Closure:内部函数中对enclosing作用域变量的引用,它会将enclosing作用域变量传递到内部函数的closure中
闭包的作用:
- 封装
- 代码复用
python闭包二
求和
defmy_sum(*arg): iflen(arg)==0: return0 forvalinarg: ifnotisinstance(val,int):#有一个非int则返回0 return0 returnsum(arg) defmy_average(*arg): iflen(arg)==0: return0 forvalinarg: ifnotisinstance(val,int):#有一个非int则返回0 return0 returnsum(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())
闭包的使用
defmy_sum(*arg): returnsum(arg) defmy_average(*arg): returnsum(arg)/len(arg) defdec(func): defin_dec(*arg):#my_sum print('indecarg=',arg) iflen(arg)==0: return0 forvalinarg: ifnotisinstance(val,int): return0 returnfunc(*arg)#闭包,存在于in_dec函数中的__closure__中,所以可以调用 returnin_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
使用装饰器的方式
defdec(func): defin_dec(*arg):#my_sum print('indecarg=',arg) iflen(arg)==0: return0 forvalinarg: ifnotisinstance(val,int): return0 returnfunc(*arg)#闭包,存在于in_dec函数中的__closure__中,所以可以调用 returnin_dec#如果没有返回值,则my_sum调用装饰器后为None #my_sum=dec(my_sum)#不手动传参 @dec#装饰器将my_sum作为参数传入dec,并返回一个新的函数赋值给my_sum defmy_sum(*arg): returnsum(arg) defmy_average(*arg): returnsum(arg)/len(arg) print(my_sum(1,2,3,4,5)) print(my_sum(1,2,3,4,5,'6'))
另一个例子
defdeco(func): defin_deco(x,y): print('indeco') func(x,y) print('calldeco') returnin_deco @deco defbar(x,y): print('inbar',x+y) bar(1,2)
以上就是Python中LEGB和闭包及装饰器的介绍,如有疑问请留言或者到本站社区交流讨论,本站关于Python的文章还有很多,还希望大家搜索查阅,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!