zoukankan      html  css  js  c++  java
  • python笔记十三(高阶函数、装饰器)

    一、高阶函数

    函数只要有以下两个特征中一个就可以称为高阶函数:

      a:函数名作为一个实参传入另一个函数中

      b:函数的返回值中包含函数名

    下面我们用代码来感受一下这两种形式:

    import time
    # 通过高阶函数将函数名作为参数传入,在不改变函数源代码的情况下为其添加功能
    def bar():
        time.sleep(3)
        print("in the bar")
    
    def test1(func):
        start_time = time.time()
        func()
        end_time = time.time()
        print("in the  function the cost time is :%s"%(end_time-start_time))
    
    test1(bar)

      将函数名作为一个参数传入,这样就可以实现不修改函数源代码的情况下为其增加功能。

    def bar():
        time.sleep(3)
        print("in the bar")
    
    def test2(func):
        print(func)
        return func
    bar = test2(bar)
    bar()  

      返回值中包含函数名,这样就可以实现不修改函数的调用方式

      以上两点非常重要,是我们在接下来要将的装饰器能够实现的原理。

    二、装饰器

      在搞清楚以上两个高阶函数的形式和可以实现的功能之后,我们就可以在此基础上实现装饰器。

      装饰器为了实现以下两个目的,一方面为已有的函数增加新的功能,另一方面要不改变函数的调用的方式。

      

    import time
    
    def timer(func):  #timer(test1) func = test1
        def wrapper(*args,**kwargs):  #这里加了*args和**kwargs就可以不限制被修饰参数的类型了
            start_time = time.time()
            func(*args,**kwargs)
            stop_time = time.time()
            print("the function runing time is %s"%(stop_time-start_time))
        return wrapper
    
    @timer  #  test1 = timer(test1) =deco
    def test1():
        time.sleep(3)
        print("in the test 1")
    
    #print(timer(test1)) 打印deco的内存地址
    test1()  #实际上在执行deco
  • 相关阅读:
    【转】我该 不该学习VULKAN
    游戏开发内功秘籍记录
    VS 配置外部DLL的引用路径【可执行文件的环境路径】
    OpenGL3.x,4.x中使用FreeImage显示图片的BUG-黑色,或颜色分量顺序错乱
    C++风格与C风格文件读写效率测试-vs2015,vs2017
    【转】矩阵的几何解释
    android 线程间通信
    android 网络
    安卓 碎片 如何实现类似 活动 栈的 进栈 出栈
    安卓 内容提供者 观察者 解析器
  • 原文地址:https://www.cnblogs.com/nadech/p/8046765.html
Copyright © 2011-2022 走看看