目 录CONTENT

文章目录

装饰器

懿曲折扇情
2022-07-16 / 0 评论 / 9 点赞 / 340 阅读 / 525 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-07-16,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
广告 广告

一、装饰器

在不改变函数逻辑的情况下,为函数添加额外功能

二、装饰器实现代码

先实现质数查询的函数

test_prime.py

# coding=utf-8
"""
    @Project :pachong-master 
    @File    :test_decorator.py
    @Author  :gaojs
    @Date    :2022/7/16 21:12
    @Blogs   : https://www.gaojs.com.cn
"""
import time


def prime_number(num):
    """
    计算是否是质数
    :return:
    """
    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 count_prime_number(maxnumber):
    """
    统计质数个数
    :return:
    """
    count = 0
    t1 = time.time()
    for i in range(2, maxnumber):
        if prime_number(i):
            count += 1
            print(count)
    t2 = time.time()
    print(f'***********************总共耗时 {t2 - t1} **************************')
    return count

未带装饰器执行结果

image-1657978385298

统计函数执行时长的装饰器

def display_time(func):
    """
    执行此函数耗时计算
    :param func:
    :return:
    """
    def wrapper(*args, **kwargs):
        t1 = time.time()
        result = func(*args, **kwargs)
        t2 = time.time()
        print('***********************总共耗时: {:.4} s **************************'.format(t2 - t1))
        return result
    return wrapper


def prime_number(num):
    """
    计算是否是质数
    :return:
    """
    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_number(maxnumber):
    """
    统计质数个数
    :return:
    """
    count = 0
    for i in range(2, maxnumber):
        if prime_number(i):
            count += 1
            print(count)
    return count
    

count = count_prime_number(9999)
print(count)

带上装饰器的执行结果

image-1657978696721

三、装饰器总结

这里会用到args和kwargs, 如果函数有传参和返回值,则装饰器也要有参数和返回值

def xx1(被装饰函数):
     def xx2(如果被装饰函数有参数那么输入):
             xxxxxxxxxxxxxxx
             被装饰函数(如果被装饰函数有参数那么输入)
             xxxxxxxxxxxxxxx
             # 如果被装饰函数中含有reture则需要返回被装饰函数
             # 没有则不需要
       reture xx2
def xx1(func):
    """
    执行此函数耗时计算
    :param func:
    :return:
    """
    def xx2(*args, **kwargs):
        xxxxxxxxx
        # 如果函数fanc()有返回值,则需要接受返回值
        result = func(*args, **kwargs)
        xxxxxxxxx
        return result
    return wrapper

9

评论区