装饰器Decorator
装饰器经常用在Web开发,日志处理,性能收集和权限控制等方面。
装饰器是一个实现了给现有函数添加装饰功能的函数。
如果不用装饰器,计算1到999的质数所用的时间可以用下面:
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():
start = time.time()
for i in range(2,1000):
if is_prime(i):
print(i)
end = time.time()
print(end - start)
prime_nums()
我们加上装饰器:
装饰器是一个函数,它的参数是另外一个函数,他的作用是给一个函数附加一些额外的代码,但是并不改变函数名和函数体。
import time
# 装饰器
def display_time(func):
def wrapper():
start = time.time()
func()
end = time.time()
print("所需时间{:.2f}".format(end - start))
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,1000):
if is_prime(i):
print(i)
prime_nums()
当使用调用prime_nums()
函数时,会进入装饰器display_time
,然后先运行wrapper()
函数,然后运行时间戳,然后运行wrapper函数通过形参func
传入的prime_nums()函数,最后返回wrapper函数的结果。
我们改进一下,让要运行的函数可以传入参数并且可以添加返回值,代码如下:
import time
# 装饰器
def display_time(func):
def wrapper(*args):
start = time.time()
counts = func(*args)
end = time.time()
print("所需时间{:.2f}".format(end - start))
# 注意return的位置,函数内return后面的代码将不执行
return counts
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 count_prime_nums(maxnum):
"""计算素数的个数"""
count = 0
for i in range(2,maxnum):
if is_prime(i):
count += 1
return count
count_nums = count_prime_nums(1000)
print(count_nums)