• 函数的装饰器初识


    eg:1 李业,在一家xx科技有限公司工作,主管安排了一个任务,
    写一个代码测试怼怼哥写的函数的执行效率。
    import time(一个模块)
    def index():
    time.sleep(2)
    print('欢迎访问博客园首页')

    计算函数运行的效率
    print(time.time())
    start_time = time.time()
    index()
    end_time = time.time()
    print(f'此函数的执行效率{end_time-start_time}')

    1. 主管让你测试小邓,李大象,重复代码太多。
      def func1():
      time.sleep(2)
      print('欢迎访问日记首页')

    def func2():
    time.sleep(1)
    print('欢迎访问评论首页')

    start_time = time.time()
    func1()
    end_time = time.time()
    print(f'此函数的执行效率{end_time-start_time}')

    start_time = time.time()
    func2()
    end_time = time.time()
    print(f'此函数的执行效率{end_time-start_time}')

    1. 整合到函数中
      def func1():
      time.sleep(2)
      print('欢迎访问日记首页')

    def func2():
    time.sleep(1)
    print('欢迎访问评论首页')

    def test_time(x):
    start_time = time.time()
    x()
    end_time = time.time()
    print(f'此函数的执行效率{end_time-start_time}')
    test_time(func1)
    test_time(func2)

    1. 怼怼哥这个函数在实际项目中被500执行,主管要求:在被执行此函数时,同时要测试一下被执行函数的效率。
      def index():
      time.sleep(2)
      print('欢迎访问博客园首页')
      index()

    def test_time(x):
    start_time = time.time()
    x()
    end_time = time.time()
    print(f'此函数的执行效率{end_time-start_time}')

    test_time(index)

    版本4的问题: 开放原则满足了,封闭原则:不改变原函数的源码,以及调用方式。违反了封闭原则:改变了函数的调用方式。

    版本5: 不能改变原函数的调用方式(闭包):
    def index():
    time.sleep(2)
    print('欢迎访问博客园首页')
    index()

    def func1():
    time.sleep(2)
    print('欢迎访问日记首页')

    def test_time(x): x = index
    def inner():
    start_time = time.time()
    x()
    end_time = time.time()
    print(f'此函数的执行效率{end_time-start_time}')
    return inner
    index = test_time(index)
    index()

    语法糖 @加上装饰器函数的名
    def f():
    print(666)
    f = '太白'
    print(f)

    def test_time(x): x = index
    def inner():
    start_time = time.time()
    x()
    end_time = time.time()
    print(f'此函数的执行效率{end_time-start_time}')
    return inner

    @test_time index = test_time(index)
    def index():
    time.sleep(2)
    print('欢迎访问博客园首页')
    index = test_time(index)
    index()

    def func1():
    time.sleep(2)
    print('欢迎访问日记首页')

    @test_time
    def func2():
    time.sleep(1)
    print('欢迎访问评论首页')

    func2 = test_time(func2)
    func3 = test_time(func3)
    func2()

    版本6:被装饰函数有返回值
    def test_time(x): x = index
    def inner():
    start_time = time.time()
    ret = x()
    print(F'ret: {ret}')
    end_time = time.time()
    print(f'此函数的执行效率{end_time-start_time}')
    return ret
    return inner

    @test_time index = test_time(index)
    def index():
    time.sleep(0.5)
    print('欢迎访问博客园首页')
    return True

    print(index()) inner()
    你应该是让True返回给index()这样才完美了,但是现在index是inner,所以你要是完全不改变原函数的使用,你print(index()) ---> True

    版本7: 被装饰函数带参数,无论加不加装饰器,你的实参'太白金星'应该传给形参n,。但版本6不能实现传参,index('太白金星') == inner('太白金星')

    def test_time(x): x = index
    def inner(args,**kwargs):
    函数的定义:
    ** 聚合。
    args = ('苹果')
    args = (1, 3)
    start_time = time.time()
    ret = x(args,**kwargs)
    函数的执行:
    ** 打散。
    ret = x(('苹果')) ==x('苹果',)
    ret = x(
    (1, 3)) ==x(1,3)
    print(F'ret: {ret}')
    end_time = time.time()
    print(f'此函数的执行效率{end_time-start_time}')
    return ret
    return inner

    @test_time index = test_time(index)
    def index(n):
    time.sleep(0.5)
    print(f'欢迎{n}访问博客园首页')
    return True

    @test_time index = test_time(index)
    def func2(a,b):
    time.sleep(0.5)
    print(f'最终结果:{a+b}')
    return a + b

    print(index('苹果')) inner('苹果')
    print(func2(1,3)) == inner(1,3)

    def warpper(f):
    def inner(args,**kwargs):
    '''被装饰函数之前的操作'''
    print(666)
    ret = f(
    args,**kwargs)
    '''被装饰函数之后的操作'''
    print('执行完毕了')
    return ret
    return inner

    @warpper
    def func():
    print(111)
    func()
    func()
    func()
    func()
    func()
    装饰器的应用:在不改变原函数的源码以及调用方式前提下,为其增加额外的功能。
    登陆认证,打印日志等。

  • 相关阅读:
    PreparedStatementUpdateTest.java
    JDBCUtils.java
    StringTest.java
    创建线程的方式四:使用线程池
    用递归实现解决斐波那契数列。
    反射的用处。Class对象的介绍,怎么通过反射创建实例和调用方法。
    基于jenkins+docker+git 持续化自动部署项目(详细版一));
    git常用命令,linus的神作之一。
    电话号码的字母组合。(每天一道,防止痴呆)
    编写一个函数来查找字符串数组中的最长公共前缀。(每天一道防止痴呆)
  • 原文地址:https://www.cnblogs.com/-777/p/11076846.html
Copyright © 2020-2023  润新知