首先我们看一段代码
import time
def is_prime(num):
if num < 2:
return False
elif num == 2:
return True
else:
for i in range(2, num):
if num % i == 0:
return False
return True
def prime_nums():
t1 = time.time()
for i in range(2,10000):
if is_prime(i):
print(i)
t2 = time.time()
print(t2 - t1)
prime_nums()
这段代码非常容易理解就是找出2-10000中所有的素数,然后计算花费的时间,再计算花费时间。由于不同逻辑混杂在一起,程序的可读性会大打折扣,于是我们做一些调整我们把计算耗时的功能交给装饰器来做。
import time
def display_time(func):
def wrapper():
t1 = time.time()
func()
t2 = time.time()
print(t2-t1)
return wrapper
def is_prime(num):
if num < 2:
return False
elif num == 2:
return True
else:
for i in range(2, num):
if num % i == 0:
return False
return True
@display_time
def prime_nums():
for i in range(2,10000):
if is_prime(i):
print(i)
prime_nums()
如上面代码所示 我们写了一个display_time()的装饰器,其中里面的参数func 就代表我们装饰的函数,然后里面还有 一个函数 wrapper(),用来编写当我们运行装饰器的时候需要执行哪些内容。首先运行的时候会先截取一个时间,然后运行我们装饰的函数,最后再截取一个时间。这样一个简单的装饰器就完成了。
另外一种情况就是被修饰的函数有返回值怎么处理
import time
def display_time(func):
def wrapper():
t1 = time.time()
result = func()
t2 = time.time()
print(t2-t1)
return result
return wrapper
def is_prime(num):
if num < 2:
return False
elif num == 2:
return True
else:
for i in range(2, num):
if num % i == 0:
return False
return True
@display_time
def prime_nums():
count = 0
for i in range(2,10000):
if is_prime(i):
print(i)
count+=1
return count
prime_nums()
上面就是我们实现的函数存在返回值 ,装饰器应该如何处理,只需要在装饰器warpper函数中,定义一个值接收代表被装饰函数的func返回出来的值,然后再从warpper中返回出来就可以了。
还有一种情况就是,如果被装饰的函数存在参数
import time
def display_time(func):
def wrapper(*args):
t1 = time.time()
result = func(*args)
t2 = time.time()
print(t2-t1)
return result
return wrapper
def is_prime(num):
if num < 2:
return False
elif num == 2:
return True
else:
for i in range(2, num):
if num % i == 0:
return False
return True
@display_time
def prime_nums(maxnum):
t1 = time.time()
for i in range(2,maxnum):
if is_prime(i):
print(i)
t2 = time.time()
print(t2 - t1)
prime_nums(10000)
我们同时在warpper和func中都传入了*args,它代表的意思是在不确定被装饰函数要传入的参数数量的时候,用来接收所有被传入的参数。