什么是装饰器,怎样使用装饰器
在不改变函数功能的情况下,将不属于函数功能的东西剥离出去。什么意思?比如一个函数是完成一个加法操作,但是函数中还添加了执行完加法所用的时间,那么这个函数就不纯粹了,因为不满足单一原则,这时我们可以将计时部分分离出去,那么分离出去的东西应该放到哪里去?答案就是装饰器。并且大多数开发中,源代码是不让修改的!
如下面所示:
def add():
t1 = time.time()
result = 10 + 20
t2 = time.time()
print(t2 - t1)
def diaplay_time(func):
def wrapper():
t1 = time.time()
func()
t2 = time.time()
print(t2 - t1)
return wrapper
@display_time
def add()
result = 10 + 20
这样有个好处就是,假如现在有四个函数,分别是加、减、乘、除,要分别计算两个数运算所需要的时间,那么就可以把计时部分分离出来,这样每个函数就很纯粹,并且避免了代码冗余。需要注意的是,每个函数前都需要加上"@装饰器名字"。
函数执行顺序就是:先跳到add的位置上,看到add上面有装饰器(@display_time),那么就会跳到装饰器,先运行装饰器函数,先计算t1,然后再计算func()(此处就是add),最后计算t2,然后打印 t2 - t1。
带参数和返回值的装饰器
现在要统计[2, maxnum]之间的质数个数
maxnum:传进来的参数;
count:返回值,表示多少个;
is_prime函数:功能是判断该数是不是质数,且该函数不允许修改(那么要计算时间必须要使用装饰器了);
count_prime_num函数:功能是完成计数
import time
def display_time(func):
def wrapper(*argc): #*argc表示任意个参数
t1 = time.time()
result = func(*argc)
t2 = time.time()
print("total time: {:.4}s".format(t2 - t1)) # :.4表示保留小数点后四位
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 count_prime_num(maxnum):
count = 0
for i in range(2, maxnum):
if is_prime(i):
count += 1
return count
if __name__ == '__main__':
count = count_prime_num(5000)
print(count)
#例如计算count_prime_num(5000)
>>>total time: 0.1542s
>>>669