python函数之闭包函数与装饰器
闭包函数
-
概述
- 闭包函数本质就是函数
- 在函数外面是无法访问函数内部数据的,通过闭包函数在函数外面访问函数内部的数据
- 使用闭包有风险,占用内存,可能会导致内存溢出,闭包在使用中将函数内部的局部变量永久保存在内存中.
-
闭包函数的必要条件
- 函数的嵌套定义
- 内部函数使用外部函数的变量
- 外部函数必须有返回值, 返回内部函数名
-
闭包函数的执行
def fun(): name = "liming" def inner(): print(name) age = 12 return name, age return inner if __name__ == '__main__': # 调用外层函数 fun , 把内层函数inner返回给inner_function变量 # inner只是赋值给了inner_function, 没有被调用 # 注意此时name依然存在,没有被释放, 因为内层函数引用了name的值, # 且内层函数赋值给了全局变量inner_function inner_function = fun() # 相当于 inner_function = inner # 调用内层函数inner print(inner_function()) # 相当于 inner()
-
闭包的作用
- 让函数内部的局部变量, 在函数执行完成后, 让外部能够操作这个变量, 延长了函数内部变量的生命周期
-
应用场景:
- 在项目开发中可以使用闭包函数,对程序进行扩展
-
案例: 检测某个函数的执行时间
```python import time def execution_time(func): def inner(): start_time = time.time() func() end_time = time.time() print(f'函数执行共用时{end_time-start_time}') return inner def program(): print("这是个一程序") time.sleep(2) print("执行结束") if __name__ == '__main__': # 调用闭包的外层函数,传入要检测的函数, 将内层函数inner返回给inner_function inner_function = execution_time(program) # 调用inner_function, 即inner函数 inner_function() ```
装饰器
-
概述
- 装饰器函数本质就是一个闭包, 也是一个函数
- 装饰器有其固定的语法格式
-
作用
- 在不修改原函数及其调用方式的情况下对原函数功能进行拓展
-
格式
-
@装饰器名称
被装饰的函数
-
def outer(func): def inner(*args, **kwargs): # 被装饰函数之前执行的代码 ret = func(*args, **kwargs) # 被装饰的函数 # 被装饰函数之后执行的代码 return ret return inner @outer def function(*args, **kwargs): pass
-
-
案例1: 修改年龄(带参数的装饰器)
def outer(fun): def inner(name, age): print(f"修改前的年龄{age}") age -= 2 fun(name, age) return inner @outer # 相当于 change_age = outer(change_age) 即把inner赋值给change_age def change_age(name, age): print(f"我是{name}, 今年{age}岁") if __name__ == '__main__': change_age("李明", 20)
-
案例2: 测试程序执行时间( 带返回值的装饰器)
import time def outer(func): def inner(*args, **kwargs): start_time = time.time() ret = func(*args, **kwargs) # 被装饰的函数 end_time = time.time() print(f'函数执行共用时{end_time-start_time}') return ret return inner @outer def function(): print("这是个一程序") time.sleep(2) print("执行结束") return "ok" if __name__ == '__main__': ret = function() print(ret)