闭包函数
什么是闭包函数:
闭包函数是 函数嵌套、函数对象、名称空间与作用域 结合体
闭包函数注意事项:
- 闭包函数必须在函数内部定义
- 闭包函数可以引用外层函数的名字
#直接传参 def func(x): print(x) func(1000) 1000 #通过闭函数传参 def outer(number): def inner(): print(number) return inner func = outer(1000) # --->inner地址 ----> func变量名 func() #---> inner地址
装饰器
什么是装饰器 : 在函数中用来给添加新功能的工具
为什么要用装饰器:
为了提高代码的可读性,防止代码的冗余
怎么用装饰器:
- 不修改被装饰对象的源代码
- 不修改被装饰对象的调用方式
被装饰对象: -----> 需要添加功能 函数
装饰器:------> 被装饰对象添加的新功能 的 函数
time_record --- > 装饰器
# 统计下载电影函数的运行时间 import time def download_movie(): print('电影开始下载...') time.sleep(3) print('电影下载完成...') start_time = time.time() download_movie() end_time = time.time() print(f'消耗时间:{end_time - start_time}') 电影开始下载... 电影下载完成... 消耗时间:3.000986099243164 # 装饰器写法: import time def download_movie(): print('电影开始下载...') time.sleep(3) print('电影完成下载...') def time_record(func): def inner(): start_time = time.time() func() end_time = time.time() print(f'消耗数间:{end_time - start_time}') return inner download_movie = time_record(download_movie) download_movie()
装饰器的语法糖 ,是属于装饰器的
@: 装饰器的语法糖
注意: 在使用装饰器语法糖时,装饰器必须定义在被装饰对象之上
import time #统计函数执行时间装饰器 def wrapper(func): def inner(*args, **kwargs):# 被装饰对象 #调用前新增功能 start_time = time.time() #调用被装饰对象,并接收返回值 res = func(*args, **kwargs) #调用后添加新功能 end_time = time.time() print(end_time - start_time) return res return inner