zoukankan      html  css  js  c++  java
  • Python随心记--装饰器

    装饰器
    本质就是函数,功能是为其他函数添加附加功能
    原则是:不修改被修饰函数的源代码
    不修改被修饰函数的调用方式
    统计函数的运行时间 
    import time
    def cal(l):
        start_time = time.time()
        res = 0
        for i in l:
            time.sleep(0.1)
            res += i
        stop_time = time.time()
        print('函数的运行时间是%s秒' %(stop_time - start_time))
        return res
    print(cal(range(10)))
    加上装饰器方法 统计函数的运行时间
    import time
    def timmer(func):
        def wapper(*args,**kwargs):
            start_time = time.time()
            res = func(*args,**kwargs)
            stop_time = time.time()
            print('函数的运行时间是%s秒' %(stop_time - start_time))
            return res
        return wapper
    @timmer
    def cal(l):
        res = 0
        for i in l:
            time.sleep(0.1)
            res += i
        return res
    print(cal(range(10)))
    装饰器的知识储备
    装饰器 = 高阶函数+函数嵌套+闭包
    高阶函数
    函数接收的参数是一个函数名
    函数的返回值是一个函数名
    满足上述任意条件一个都是高阶函数
    
    
    def foo():
        print('你好啊林师傅')
    def test(func):   #高阶函数
        print(func)
        func()
    print(test(foo))
    
    
    import time
    def foo():
        print('你好啊林师傅')
    def test(func):
        print(func)
        start_time = time.time()
        func()
        stop_time = time.time()
        print('函数的运行时间是%s秒' % (stop_time - start_time))
    print(test(foo))
    注:以上多运行了一次foo函数  

    #高阶函数满足不了装饰器
    
    
    import time
    def foo():
        time.sleep(1)
        print('来自foo')
    #不修改foo代码
    #不修改foo调用方式
    def timer(func):
        start_time = time.time()
        func()
        stop_time = time.time()
        print('函数的运行时间是%s秒' % (stop_time - start_time))
        return func
    foo = timer(foo)
    print(foo())
    
    
    函数嵌套:函数里面定义一个函数
    def father(name):
        print('from father %s' %name)
        def son():
            print('from son')
            def grandson():
                print('from grandson')
            grandson()
        son()
    father('大佬')
    def father(name):
        print('from father %s' %name)
        def son():
            print('from son')
        print(locals())
    father('大佬')
    函数嵌套及作用域
    def father(name):
        def son():
            print('from son %s' %name)
        son()
    father('大佬')
    def father(name):
        def son():
            name = '小豆芽'
            print('from son %s' %name)
        son()
    father('大佬')

    函数闭包装饰器基本实现
    装饰器的框架
    import time
    def itmmer(func):
        def wrapper():
            strat_time = time.time()
            func()   #执行test函数
            stop_time = time.time()
            print('函数的运行时间是%s秒' % (stop_time - strat_time))
        return wrapper
    def test():
        time.sleep(3)
        print('test函数运行完毕')
    test = itmmer(test)#返回的是wrapper的地址
    test()
    #   @timmer  相当于 test = itmmer(test)  语法糖
    import time
    def itmmer(func):
        def wrapper():
            strat_time = time.time()
            func()   #执行test函数
            stop_time = time.time()
            print('函数的运行时间是%s秒' % (stop_time - strat_time))
        return wrapper
    @itmmer
    def test():
        time.sleep(3)
        print('test函数运行完毕')
    test()
    这里添加test返回值,,解决函数最后返回的None
    import time
    def itmmer(func):
        def wrapper():
            strat_time = time.time()
            res = func()   #执行test函数
            stop_time = time.time()
            print('函数的运行时间是%s秒' % (stop_time - strat_time))
            return res
        return wrapper
    @itmmer
    def test():
        time.sleep(1)
        print('test函数运行完毕')
        return '这里添加test返回值,,解决函数最后返回的None'
    res = test()   #这里会最后会返回一个None
    print(res)

    带参数
    import time
    def itmmer(func):
        def wrapper(name,age):
            strat_time = time.time()
            res = func(name,age)   #执行test函数
            stop_time = time.time()
            print('函数的运行时间是%s秒' % (stop_time - strat_time))
            return res
        return wrapper
    @itmmer
    def test(name,age):
        time.sleep(1)
        print('test函数运行完毕,名字是%s,年龄是%s' %(name,age))
        return '这里添加test返回值,,解决函数最后返回的None'
    test('ss',20)
    带参数 修改为可变参数
    import time
    def itmmer(func):
        def wrapper(*args,**kwargs):
            strat_time = time.time()
            res = func(*args,**kwargs)   #执行test函数
            stop_time = time.time()
            print('函数的运行时间是%s秒' % (stop_time - strat_time))
            return res
        return wrapper
    @itmmer
    def test(name,age):
        time.sleep(1)
        print('test函数运行完毕,名字是【%s】,年龄是【%s】' %(name,age))
        return '这里添加test返回值,,解决函数最后返回的None'
    test('ss',20)
    可变参数 *args,**kwargs 传参实例
    def test2(name,age,gender):
        print(name)
        print(age)
        print(gender)
    def test1(*args,**kwargs):
        test2(*args,**kwargs)   #test2(*('alex',18,'male','x','y'),**{})
    
    
    
    
  • 相关阅读:
    接口测试基础07
    性能测试基础01
    接口测试基础06
    将java list转换为js的数组
    java 网络编程
    java分页
    单例模式
    适配器模式
    抽象工厂模式
    工厂模式
  • 原文地址:https://www.cnblogs.com/Essaycode/p/10126567.html
Copyright © 2011-2022 走看看