需求:检测程序运行时间(不能改变原函数的调用方式)
方法一:原程序下添加
每个函数开头结尾都要多添加两行代码麻烦,冗余,增加工作量、添加删除不灵活
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 start=time.time() 2 print('程序运行') 3 print(time.time()-start)
方法二:函数中添加
引入time模块
改变了原函数的调用方式,如果协调开发容易埋雷
1 def tims(func): #func参数赋值name
2 start=time.time()
3 func() #调用参数name()函数
4 print(time.time()-start)
5
6 def name():
7 print('打印白瑞峰')
8 time.sleep(1)
9 print('打印结束')
10 tims(name) #调用tims()传入参数名name
方法三:(装饰器应用)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 def tims(func): #func参数赋值name 2 start=time.time() 3 func() #调用参数name()函数 4 print(time.time()-start) 5 6 def name(): 7 print('打印白瑞峰') 8 time.sleep(1) 9 print('打印结束') 10 name=tims(name) #内存地址的改变 11 # 上面代码可以打印结果,但是会报错,因为函数tims没有返回值 12 name()
1 def tims(func): #func参数赋值name
2 def inner(): # 闭包函数
3 start=time.time()
4 func() #内部函数运用了外部函数的变量
5 print(time.time()-start)
6 return inner #这里返回的是一个地址
7
8 @tims #等同于name=tims(name)
9 def name(): #被装饰函数
10 print('打印白瑞峰')
11 time.sleep(1)
12 print('打印结束')
13 # name=tims(name) #内存地址的改变
14 name() #现在调用的是inner函数
装饰器作用:
在不修改原函数机器调用方式的情况下对原函数的功能进行扩展
方法四:(装饰器的参数运用)
1 import time,random
2 def cal_time(func):
3 def wrapper(*args,**kwargs):
4 start=time.time()
5 results=func(*args,**kwargs)
6 print(time.time()-start)
7 return results
8 return wrapper
9 @cal_time
10 def func_name(name): #形参
11 time.sleep(0.1)
12 print(name) #打印参数
13 func_name(999) #入参
方法五:(装饰器的作用与取消)
1 import time,random
2 def outer(state): #控制函数
3 def cal_time(func): #装饰器函数
4 def wrapper(*args,**kwargs): #闭包函数
5 if state: #判断为真执行
6 start=time.time() #调用之前做的事情
7 results=func(*args,**kwargs)
8 if state:
9 print(time.time()-start) #调用之后做的事情
10 return results
11 return wrapper
12 return cal_time
13
14 @outer(True) #True and false 根据参数 执行,或者不执行
15
16 def func_name(name): #被装饰函数(装饰函数紧跟着被装饰函数)
17 time.sleep(0.1) #等待时间模拟程序运行的
18 print(name)
19 func_name(999)