• 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
  • 相关阅读:
    Qt5.3.0 for android windows平台下搭建及demo(虫子的博客)
    不分享,用户很少,什么都没有,没有秒传
    Entity Framework 5.0系列之约定配置
    学习SQL关联查询
    SQL语句调优
    数组总结篇(上)
    实现同一套代码针对不同平台工程的编辑和编译
    dispatch队列
    SOCKET网络编程快速上手(一)
    Javascript判断两个日期是否相等
  • 原文地址:https://www.cnblogs.com/nadech/p/8046765.html
Copyright © 2020-2023  润新知