Python闭包及装饰器运行原理解析
作者:吞风吻雨ii 时间:2022-12-16 20:59:06
一、闭包
闭包从形式上来说是在外部函数中定义内部函数,并且内部函数引用了外部函数的变量,此变量叫做自由变量。
或者说是将组成函数的语句和这些语句的执行环境打包在一起。
闭包满足的条件:
必须有一个内嵌函数
内嵌函数必须使用外部函数的变量
外部函数的返回值必须是内嵌函数
def closure():
value = []
def fun(tmp):
value.append(tmp)
return value
return fun
cc = closure()
cc(0) #[0] 等同于closure(fun(0))
cc(1) #[0,1]
cc(2) #[0,1,2]
外部函数closure中有变量value和内部函数fun,并且内部函数fun引用了自由变量value,当执行cc = closure()时,就产生了一个闭包fun,该闭包持有只有变量value,当函数closure生命周期结束后,value依然存在,因为它被闭包引用了。
二、装饰器
装饰器其实就是闭包的应用,只不过其传递的是函数。
def add_time(fun):
def wrapper():
print('time: 12:00')
return fun()
return wrapper
def add_format(fun):
def wrapper():
print('\n')
return fun()
return wrapper
@add_format #等同于demo = add_format(add_time(demo))
@add_time #等同于 demo = add_time(demo)
def demo():
return 'hello world!'
另外,装饰器会将demo函数的元信息丢失,例如__name__等等。
例如demo函数的__name__会由'demo'变成了'wrapper',这时需要用到functools库,在wrapper函数前加上@functools.wraps(fun):
import functools
def add_time(fun):
@functools.wraps(fun)
def wrapper():
print('time: 12:00')
return fun()
return wrapper
def add_format(fun):
@functools.wraps(fun)
def wrapper():
print('\n')
return fun()
return wrapper
@add_format #等同于demo = add_format(add_time(demo))
@add_time #等同于 demo = add_time(demo)
def demo():
return 'hello world!'
例如给任意函数加上打印时间的功能的装饰器:
def metric(fn):
start=time.time()
@functools.wraps(fn)
def wrapper(*args,**kw):
end=time.time()
print('%s executed in %s ms' % (fn.__name__,start-end))
return fn(*args,**kw)
return wrapper
来源:https://www.cnblogs.com/LMIx/p/13126617.html
标签:python,闭包,装饰器
0
投稿
猜你喜欢
Python进程管理神器Supervisor详解
2023-01-19 00:57:19
JavaScript 数据结构之集合创建(1)
2024-04-19 10:14:34
极力推荐10个短小实用的JavaScript代码段
2024-06-05 09:12:40
常见数据库系统比较 Oracle数据库
2024-01-26 04:18:57
python实现简单聊天应用 python群聊和点对点均实现
2023-01-16 08:35:55
一文详解Golang中new和make的区别
2024-05-22 17:43:40
MySQL学习(七):Innodb存储引擎索引的实现原理详解
2024-01-25 05:53:02
Python采集代理ip并判断是否可用和定时更新的方法
2022-12-01 15:19:05
Google谷歌农历鼠年春节的变化
2008-02-11 17:07:00
MySQL MHA 运行状态监控介绍
2024-01-14 01:32:37
对python 树状嵌套结构的实现思路详解
2022-02-04 15:45:06
Python网络爬虫实例讲解
2023-09-11 23:18:10
Python列表(List)知识点总结
2023-11-04 00:01:35
高性能WEB开发 web性能测试工具推荐
2022-06-09 00:29:59
利用PyQt5制作一个豆瓣电影信息查看器
2021-03-05 05:57:28
Quasar Input:type="number" 去掉上下小箭头 实现加减按钮样式功能
2024-04-16 09:13:02
网页栅格系统研究:960的秘密
2008-10-24 17:03:00
Sqlserver 2000/2005/2008 的收缩日志方法和清理日志方法
2012-07-21 14:55:18
Keras 切换后端方式(Theano和TensorFlow)
2023-05-30 22:35:03
php 保留小数点
2023-06-21 10:47:04