python 装饰器decorator

本文介绍了Python装饰器的概念,展示了如何使用装饰器来剥离函数中的非核心功能,例如计时。通过一个实例,演示了如何使用装饰器计算函数执行时间,并给出了带参数和返回值的装饰器应用,用于统计指定范围内质数的数量。装饰器的应用可以保持函数的纯净,减少代码冗余,提高代码复用性。
摘要由CSDN通过智能技术生成

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

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

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值