循序渐进详解装饰器

装饰器概念

  • 装饰器(Decorators)是 Python 的一个重要部分。简单地说:他们是修改其他函数的功能的函数。他们有助于让我们的代码更简短,也更Pythonic。

实例

简单示例

我们先来写一个简单的函数,比如求质数。

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():
    for i in range(2,10000):
        if is_prime(i):
            print(i)

通过调用is_prime函数,判断2~10000之间的质数。

如果我们要统计这个函数所需要的时间,那我们就需要使用time模块计算时间。

def prime_nums(maxnum):
    start = time.time()
    for i in range(2,maxnum):
        if is_prime(i):
            print(i)
    end = time.time()
    result = end-start
    print(result)

这样我们基本就能知道这个函数运行结束需要多久了,
在这里插入图片描述

装饰器作用

如果我们有很多的函数需要这样计算运行时间,总不能每一个函数都像这样写一遍time.time()吧,这时python的装饰器就起到了很方便的作用。

计时装饰器(不带参数,无返回值)

我们来写一个计算时间的装饰器

def display_time(func):
    def wapper():
        t1 = time.time()
        func()
        t2 = time.time()
        print(t2 - t1)
    return wapper

display_time函数中的参数func就是我们需要使用装饰器的函数,也就是把func这个函数当作参数传入到了display_time这个函数中。
然后在wapper这个函数中调用了这个传入的函数。


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

在需要使用装饰器的函数上加上@装饰器,即可使用装饰器的功能。
我们再来运行一次
在这里插入图片描述
可以看到效率基本一致,我们的计算功能也实现了。

带返回值装饰器

如果我们要判断质数的函数中质数的数量,并且有返回值,装饰器怎么修改。

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

因为函数有返回值,所以装饰器中页需要用一个变量接收。

def display_time(func):
    def wapper():
        t1 = time.time()
        result = func()
        t2 = time.time()
        print(t2 - t1)
        return result
    return wapper

带参数装饰器

如果函数需要传参呢

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

我们使用*args接收函数即可。

def display_time(func):
    def wapper(*args):
        t1 = time.time()
        result = func(*args)
        t2 = time.time()
        print(t2 - t1)
        return result
    return wapper

在这里插入图片描述
最后调用函数,得到的结果与我们需求的一致。

关注不迷路哦

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成都—大数据开发工程师—杨洋

你的打赏是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值