• 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
  • 相关阅读:
    js + html 实现视频截图
    检测浏览器版本是否支持webp
    【安装系统】win8装win7遇到的一些坑
    《说文解字》与程序设计
    朝花夕拾——更新两个开源项目
    js发送和接收二进制字节流数据
    字符编码--丛起原到代码
    JavaScript进行WebSocket字节流通讯示例
    JavaScript进行UTF-8编码与解码
    JS字符串与二进制的相互转化
  • 原文地址:https://www.cnblogs.com/nadech/p/8046765.html
Copyright © 2020-2023  润新知