0
点赞
收藏
分享

微信扫一扫

python 装饰器decorator

慎壹 2022-03-20 阅读 49
python

什么是装饰器,怎样使用装饰器

在不改变函数功能的情况下,将不属于函数功能的东西剥离出去。什么意思?比如一个函数是完成一个加法操作,但是函数中还添加了执行完加法所用的时间,那么这个函数就不纯粹了,因为不满足单一原则,这时我们可以将计时部分分离出去,那么分离出去的东西应该放到哪里去?答案就是装饰器。并且大多数开发中,源代码是不让修改的!
如下面所示:

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
举报

相关推荐

0 条评论