闭包
在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以后用到的一些变量叫做闭包
由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存
闭包的特点
- 外部函数内部定义函数
- 外部函数返回内部函数的引用
- 内部函数可以直接使用外部函数的环境变量
- 函数名指向了函数代码空间的对象
- 语法:
- 外部函数通过返回内部函数的引用
- 内部函数可以直接使用外部函数的-环境变量 自由变量
装饰器
--装饰目的:
- 在不修改代码的情况,对代码拓展新的功能
--装饰器功能
- 引入日志
- 函数执行时间统计
- 执行函数前预备处理
- 执行函数后清理功能
- 权限校验等场景
- 缓存
--装饰器特点
必须是闭包的形式
有且只有一个参数 -指向了被装饰的函数的引用
使用装饰器@装饰器名 等价于 f1=yanzheng(1)
# 装饰器函数特点 新增一个功能根据参数flag参数不同 '1' 使用整数输出时间差
# 使用的是其他数据 以浮点数输出时间
def get_run_time(flag):
def gettime(func):
def inner(*args, **kwargs):
begin = time.time()
ret = func()
end = time.time()
if flag == '1':
print("函数运行花费了%d s" % int(end-begin))
else:
print("函数运行花费了%f s" % (end-begin))
return ret
return inner
return gettime