python装饰器
python的装饰器,就是在不修改原有代码的基础上,增加额外的功能
假如我们原有一个函数,这个函数它的功能是寻找1-n范围内的偶数
def func():
for i in range(1000):
if i%2==0:
print(i)
r=func()
此时打印如下:
...
988
990
992
994
996
998
...
那如果我们需要 增加一个计时功能,计算该函数的运算时间
那我们可以这样写:
import time
def func():
start_time=time.time()
for i in range(1000):
if i%2==0:
print(i)
end_time = time.time()
print(end_time-start_time)
r=func()
对应的输出为:
...
992
994
996
998
0.002000570297241211
...
这样是可以满足我们的需求的
可是如果我们有很多的函数,都需要增加一个计时功能,那我们就需要重写很多次这样的代码,并且不符合我们设计模式的闭包原则
那这个时候装饰器的作用就体现出来了
我们可以写一个装饰器,这个装饰器就是专门用来提供额外的计时功能
def wfunc(func):
def wrapper():
start_time = time.time()
func()
end_time = time.time()
print(end_time-start_time)
return wrapper
import time
@wfunc
def func():
for i in range(1000):
if i%2==0:
print(i)
r=func()
- 将func函数作为参数传入装饰器中
- 由装饰器函数来计算运行时间
对应输出为:
...
990
992
994
996
998
0.0030012130737304688
...
满足需求,并且通过装饰器,减少了大量的重复代码
如果这时候我们原有的函数有返回值,那我们就需要进行以下修改
def wfunc(func):
def wrapper():
start_time = time.time()
r=func()
end_time = time.time()
print(end_time-start_time)
return r
return wrapper
import time
@wfunc
def func():
count=0
for i in range(1000):
if i%2==0:
count+=1
print(i)
return count
r=func()
print(r)
输出如下:
...
996
998
0.001998424530029297
500
...
如果我们 原有函数有参数,那我们需要做以下修改:
def wfunc(func):
def wrapper(*args):
start_time = time.time()
r=func(*args)
end_time = time.time()
print(end_time-start_time)
return r
return wrapper
import time
@wfunc
def func(n):
count=0
for i in range(n):
if i%2==0:
count+=1
print(i)
return count
r=func(10000)
print(r)
输出如下:
...
9994
9996
9998
0.03300642967224121
5000
...

362

被折叠的 条评论
为什么被折叠?



