python 装饰器

"""

装饰器

定义:
在执行一个功能A的基础上添加一个新功能AA,
不破坏原功能A的代码
并且可以复用,对A之外的很多功能B、C、D等等都可以
是一个很著名的设计模式

使用场景:经常被用于有切面需求的场景,如:添加日志、安全、事物等
好处:把大量函数中与函数功能本身无关的代码抽离出来,实现复用

"""


# python装饰器decorator之计算函数运行时间的例子

import time

# 最初的样子,没使用装饰器

def is_prime(num):
    # 判断一个数是否是质数
    if num < 2:
        return False
    elif num == 2:
        return True
    else:
        for i in range(2,num//2+1):
            if num%i == 0:
                return False
        return True

def prime_nums():
    # 打印2到10000之间的素数,添加计数器,看执行了多长时间
    t1 = time.time()
    for i in range(2,10000):
        if is_prime(i):
            print(i)
    t2 = time.time()
    print(t2-t1)

prime_nums()


# 用了装饰器,把统计时间的分离出来,无返回值

def display_time(func):    
    def wrapper():
        t1 = time.time()
        func()             
        t2 = time.time()
        print("Total time: {:.4} s".format(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//2+1):
            if num%i == 0:
                return False
        return True

@display_time
def prime_nums():
    # 打印2到10000之间的素数
    for i in range(2,10000):
        if is_prime(i):
            print(i)

prime_nums()


# 用了装饰器,把统计时间的分离出来,有返回值

def display_time(func):
    def wrapper():
        t1 = time.time()
        result = func()      
        t2 = time.time()
        print("Total time: {:.4} s".format(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//2+1):
            if num%i == 0:
                return False
        return True

@display_time
def count_prime_nums():
    # 统计质数的个数
    count = 0
    for i in range(2,10000):
        if is_prime(i):
            count += 1
    return count

count = count_prime_nums()
print(count)
# print(count_prime_nums())



# 用了装饰器,把统计时间的分离出来,有返回值,且函数有参数

def display_time(func):            
    def wrapper(*args):            
        t1 = time.time()
        result = func(*args)       
        t2 = time.time()
        print("Total time: {:.4} s".format(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//2+1):
            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_prime_nums()函数
count = count_prime_nums(500)
print(count)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值