python装饰器

首先我们看一段代码

import time
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

def prime_nums():
    t1 = time.time()
    for i in range(2,10000):
        if is_prime(i):
            print(i)
    t2 = time.time()
    print(t2 - t1)

prime_nums()

这段代码非常容易理解就是找出2-10000中所有的素数,然后计算花费的时间,再计算花费时间。由于不同逻辑混杂在一起,程序的可读性会大打折扣,于是我们做一些调整我们把计算耗时的功能交给装饰器来做。

import time
def display_time(func):
    def wrapper():
        t1 = time.time()
        func()
        t2 = time.time()
        print(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):
            if num % i == 0:
                return False
        return True


@display_time
def prime_nums():
    for i in range(2,10000):
        if is_prime(i):
            print(i)

prime_nums()

如上面代码所示 我们写了一个display_time()的装饰器,其中里面的参数func 就代表我们装饰的函数,然后里面还有 一个函数 wrapper(),用来编写当我们运行装饰器的时候需要执行哪些内容。首先运行的时候会先截取一个时间,然后运行我们装饰的函数,最后再截取一个时间。这样一个简单的装饰器就完成了。

另外一种情况就是被修饰的函数有返回值怎么处理

import time

def display_time(func):
    def wrapper():
        t1 = time.time()
        result = func()
        t2 = time.time()
        print(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):
            if num % i == 0:
                return False
        return True

@display_time
def prime_nums():
    count = 0
    for i in range(2,10000):
        if is_prime(i):
            print(i)
            count+=1
     return count
prime_nums()

上面就是我们实现的函数存在返回值 ,装饰器应该如何处理,只需要在装饰器warpper函数中,定义一个值接收代表被装饰函数的func返回出来的值,然后再从warpper中返回出来就可以了。

还有一种情况就是,如果被装饰的函数存在参数

import time


def display_time(func):
    def wrapper(*args):
        t1 = time.time()
        result = func(*args)
        t2 = time.time()
        print(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):
            if num % i == 0:
                return False
        return True


@display_time
def prime_nums(maxnum):
    t1 = time.time()
    for i in range(2,maxnum):
        if is_prime(i):
            print(i)
    t2 = time.time()
    print(t2 - t1)
prime_nums(10000)

我们同时在warpper和func中都传入了*args,它代表的意思是在不确定被装饰函数要传入的参数数量的时候,用来接收所有被传入的参数。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容