详解 Python中LEGB和闭包及装饰器
作者:lqh 时间:2023-05-19 00:16:41
详解 Python中LEGB和闭包及装饰器
LEGB L>E>G?B
L:local函数内部作用域
E:enclosing函数内部与内嵌函数之间
G:global全局作用域
B:build-in内置作用域
python 闭包
1.Closure:内部函数中对enclosing作用域变量的引用
2.函数实质与属性
函数是一个对象
函数执行完成后内部变量回收
函数属性
函数返回值
passline = 60
def func(val):
if val >= passline:
print ('pass')
else:
print ('failed')
def in_func():
print (val)
in_func()
return in_func
f = func(89)
f()
print (f.__closure__)
一般情况
def f_100(val):
passline = 60
if val >= passline:
print ('pass')
else:
print ('failed')
def f_150(val):
passline = 90
if val >= passline:
print ('pass')
else:
print ('failed')
f_100(89)
f_150(89)
闭包
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)
f_100(89)
f_150(89)
Closure:内部函数中对enclosing作用域变量的引用,它会将enclosing作用域变量传递到内部函数的closure中
闭包的作用:
封装
代码复用
python闭包二
求和
def my_sum(*arg):
if len(arg) == 0:
return 0
for val in arg:
if not isinstance(val,int): # 有一个非int则返回0
return 0
return sum(arg)
def my_average(*arg):
if len(arg) == 0:
return 0
for val in arg:
if not isinstance(val,int): # 有一个非int则返回0
return 0
return sum(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())
闭包的使用
def my_sum(*arg):
return sum(arg)
def my_average(*arg):
return sum(arg)/len(arg)
def dec(func):
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) # 闭包,存在于in_dec函数中的__closure__中,所以可以调用
return in_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
使用装饰器的方式
def dec(func):
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) # 闭包,存在于in_dec函数中的__closure__中,所以可以调用
return in_dec # 如果没有返回值,则my_sum调用装饰器后为None
# my_sum = dec(my_sum) # 不手动传参
@dec # 装饰器将my_sum作为参数传入dec,并返回一个新的函数赋值给my_sum
def my_sum(*arg):
return sum(arg)
def my_average(*arg):
return sum(arg)/len(arg)
print(my_sum (1,2,3,4,5))
print(my_sum (1,2,3,4,5,'6'))
另一个例子
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)
bar(1,2)
来源:http://blog.csdn.net/wwwdc1012/article/details/72597720
标签:Python,装饰器
0
投稿
猜你喜欢
Python实现基于HTTP文件传输实例
2021-10-23 13:24:53
获取Django项目的全部url方法详解
2022-09-08 23:06:27
JS与CSS合并写在同一份文件
2010-01-23 12:33:00
Python使用Selenium实现淘宝抢单的流程分析
2022-01-31 04:04:18
JS鼠标事件大全 推荐收藏
2024-05-28 15:41:00
C#实现的ACCESS数据库操作类完整实例
2024-01-20 02:57:36
对Python中range()函数和list的比较
2021-08-26 14:59:47
golang goquery selector选择器使用示例大全
2023-10-14 15:40:58
js select option对象小结
2024-04-19 09:58:40
如何用CocosCreator制作微信小游戏
2023-08-23 16:00:02
python数据分析之单因素分析线性拟合及地理编码
2021-02-09 06:46:20
GO语言利用K近邻算法实现小说鉴黄
2023-06-21 17:15:25
asp被杀毒软件误删的解决方法
2011-04-11 11:16:00
python音频处理用到的操作的示例代码
2021-05-11 22:05:19
深入理解Vue 的条件渲染和列表渲染
2024-04-09 10:46:37
Python实现根据IP地址和子网掩码算出网段的方法
2021-11-20 01:40:41
Oracle教程 误添加数据文件删除方法
2009-08-04 12:38:00
合并百度影音的离线数据( with python 2.3)
2022-01-11 09:22:14
Python使用future处理并发问题方案详解
2022-12-10 18:16:53
ASP数据库连接方式大全
2023-07-12 05:52:59