• Python基础—装饰器(Day11)


    装饰器

    1.装饰器是在不改变原函数的执行的情况下为原函数增额外的功能。

    简单版装饰器
    import
    time def func1(): print('执行速度') def timmer(f): start_time=time.time() f() time.sleep(0.3) end_time=time.time() print('此函数的执行效率%s'% (end_time-start_time)) f1=func1 func1=timmer func1(f1)
    import time
    def timmer1(f): #f接收的是@timmer下面原函数的函数名func1
        def inner():
            f()
            start_time=time.time()
            time.sleep(0.3)
            end_time=time.time()
            print('此函数的执行效率%s' % (end_time - start_time))
        return inner
    
    @timmer1
    def func1():
        print('测试速度')
    
    func1()
    
    执行结果:
    测试速度
    此函数的执行效率0.30037736892700195

     2.被装饰函数带参数的装饰器

    # import time
    # def timmer(f):#f=func1=inner
    #     def inner(*args,**kwargs):
    #         start_time=time.time()
    #         f(*args,**kwargs)  #func1((*args,**kwargs))
    #         time.sleep(0.3)
    #         end_time=time.time()
    #         print('此函数的执行效率%s'% (end_time-start_time))
    #     return inner
    # @timmer
    # def func1(a,b,c,d): #timmer(func1)
    #     print(a,b,c,d)
    #     print('测试效率')
    # func1(1,2,3,4)

    3.装饰器模版

    def wrapper(func):
        def inner(*args,**kwargs):
            ret=func(*args,**kwargs)
            return ret
        return inner
    
    @wrapper
    def func(a,b):
        print(666)
    func(1,2,3)

     4.带参数的装饰器

    import time
    def timmer(*args,**kwargs):
        def wrapper(f):
            def inner(*args,**kwargs):
                if flag:
                    start_time=time.time()
                    ret=f(*args,**kwargs)
                    time.sleep(0.3)
                    end_time=time.time()
                    print('此函数的执行效率%f' %(end_time-start_time))
                else:
                    ret=f(*args,**kwargs)
                return ret
            return inner
        return wrapper
    flag=True  #flag=False 关掉装饰器
    @timmer(flag) # 两步:1.把timmer(flag)当成一个普通话函数传给def timmer(),返回wrapper 2.变成@wrapper装饰器
    def func1():
        print(666)
    func1()
    
    执行结果:
    666
    此函数的执行效率0.300240

     5.多个装饰器

    def wrapper1(func):# func=f=inner1
        def inner1():
            print('wrapper1,before func') #2
            func()
            print('wrapper1,after func') #3
        return inner1
    def wrapper2(func): # func=inner1=inner2
        def inner2():
            print('wrapper2,before func') #1
            func()
            print('wrapper2,after func') #4
        return inner2
    @wrapper2 #  f = wrapper2(f)  里面的f==inner1  外面的f == inner2
    @wrapper1 # f = wrapper1(f)   里面的f==函数名f  外面的f == inner1
    def f():# f=inner1
        print('in f')
    f() #f=inner1=inner2
    
    执行结果:
    wrapper2,before func
    wrapper1,before func
    in f
    wrapper1,after func
    wrapper2,after func
  • 相关阅读:
    HDU 6134 Battlestation Operational(莫比乌斯反演)
    HDU 5514 Frogs(容斥原理)
    HDU 5909 Tree Cutting(FWT+树形DP)
    BZOJ 1030 [JSOI2007]文本生成器(AC自动机)
    BZOJ 2938 [Poi2000]病毒(AC自动机)
    HDU 6118 度度熊的交易计划(费用流)
    HDU 6119 小小粉丝度度熊(Two pointers)
    Codeforces 839E Mother of Dragons(极大团)
    Codeforces 839D Winter is here(容斥原理)
    BZOJ 2434 [Noi2011]阿狸的打字机(AC自动机)
  • 原文地址:https://www.cnblogs.com/facestore/p/8678840.html
Copyright © 2020-2023  润新知