老卫带你学---python装饰器

python装饰器

python的装饰器,就是在不修改原有代码的基础上,增加额外的功能

假如我们原有一个函数,这个函数它的功能是寻找1-n范围内的偶数

def func():
    for i in range(1000):
        if i%2==0:
            print(i)
r=func()

此时打印如下:

...
988
990
992
994
996
998
...

那如果我们需要 增加一个计时功能,计算该函数的运算时间

那我们可以这样写:

import time
def func():
    start_time=time.time()
    for i in range(1000):
        if i%2==0:
            print(i)
    end_time = time.time()
    print(end_time-start_time)
r=func()

对应的输出为:

...
992
994
996
998
0.002000570297241211
...

这样是可以满足我们的需求的

可是如果我们有很多的函数,都需要增加一个计时功能,那我们就需要重写很多次这样的代码,并且不符合我们设计模式的闭包原则

那这个时候装饰器的作用就体现出来了

我们可以写一个装饰器,这个装饰器就是专门用来提供额外的计时功能

def wfunc(func):
    def wrapper():
        start_time = time.time()
        func()
        end_time = time.time()
        print(end_time-start_time)
    return wrapper

import time
@wfunc
def func():
    for i in range(1000):
        if i%2==0:
            print(i)

r=func()
  • 将func函数作为参数传入装饰器中
  • 由装饰器函数来计算运行时间

对应输出为:

...
990
992
994
996
998
0.0030012130737304688
...

满足需求,并且通过装饰器,减少了大量的重复代码


如果这时候我们原有的函数有返回值,那我们就需要进行以下修改

def wfunc(func):
    def wrapper():
        start_time = time.time()
        r=func()
        end_time = time.time()
        print(end_time-start_time)
        return r
    return wrapper

import time
@wfunc
def func():
    count=0
    for i in range(1000):
        if i%2==0:
            count+=1
            print(i)
    return count

r=func()
print(r)

输出如下:

...
996
998
0.001998424530029297
500
...

如果我们 原有函数有参数,那我们需要做以下修改:

def wfunc(func):
    def wrapper(*args):
        start_time = time.time()
        r=func(*args)
        end_time = time.time()
        print(end_time-start_time)
        return r
    return wrapper

import time
@wfunc
def func(n):
    count=0
    for i in range(n):
        if i%2==0:
            count+=1
            print(i)
    return count

r=func(10000)
print(r)

输出如下:

...
9994
9996
9998
0.03300642967224121
5000
...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值