python 装饰器
需要先理解闭包函数
1. 统计 index函数的执行时间
import time def index(): time.sleep(2) print('welcome to index')
第一种方式
计算函数开始时间,结束时间
start_time = time.time() index() end_time = time.time() print(end_time - start_time)
此种方式缺点:
① 只能统计index()函数的执行时间,统计其他函数执行时间需要再写一次统计逻辑
第二种方式
第一种方式进阶(解决只能统计固定函数执行时间的缺点)
def timmer(func): start_time = time.time() func() # index() end_time = time.time() print(end_time - start_time)
timmer(index)
定义timmer函数,将需要统计执行时间的函数作为timmer参数传入
此种方式缺点:改变了index函数的调用方式
第三种方式
闭包函数方式
def timmer(func): def inner(): start_time = time.time() func() end_time = time.time() print(end_time - start_time) return inner index = timmer(index) index() #inner()
继续进阶 优化第三种方式
import time def timmer(func): def inner(): start_time = time.time() func() end_time = time.time() print(end_time - start_time) return inner @timmer #index = timmer(index) #python解释器遇到@符号, # 就会把其下方函数当做参数传给timmer(index) def index(): time.sleep(2) print('welcome to index') index() #inner()
↑ 当index函数有返回值时无法获取
@timmer
def index(): time.sleep(2) print('welcome to index') return 1111
res = index() #获取的是inner函数的返回值,而此时inner没有返回值
print(res)
修改inner函数接收返回值
import time def timmer(func): def inner(): start_time = time.time() res = func() #修改 end_time = time.time() print(end_time - start_time) return res #修改 return inner @timmer def index(): time.sleep(2) print('welcome to index') return 1111 res = index() #inner() print(res)
index函数会有参数,继续修改
import time def timmer(func): def inner(*args,**kwargs): #修改点 将接收到的参数传给func start_time = time.time() res = func(*args,**kwargs) #修改点 end_time = time.time() print(end_time - start_time) return res return inner @timmer def index(name): time.sleep(2) print('welcome %s to index' % name) return 1111 res = index('xiaoming') #inner('xiaoming') print(res)
以上,便实现了一个无参装饰器