详解 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的文章还有很多,还希望大家搜索查阅,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!