美文网首页
高阶函数

高阶函数

作者: 秋幻旎苏 | 来源:发表于2018-08-29 12:10 被阅读0次

    一.高阶函数

    高阶函数至少满足以下一个条件

    1. 接受一个或者多个函数作为参数
    2. 返回一个函数

    1. 内建函数-高阶函数

    • sorted(iterable[, key][, reverse]) --> list
    • filter(function or None, iterable) --> filter object
    • map(func, *iterables) --> map objec

    2. 柯里化(Currying)

    • 指的是将原来接受两个参数的函数变成新的接受一个参数的过程,新的函数返回一个以原有第二个参数为参数的函数
    • z=f(x,y) 转化成 z=f(x)(y) 的形式
    def add(x,y):
        return x + y
    #add(5,6)
    
    
    def add(x):
        def _add(y):
            return x + y
        return _add
    
    #add(5)(6)
            
    

    二.装饰器

    自身是函数, 可以增强其他函数功能
    一般接受一个函数对象作为参数,以对其进行增强

    1.装饰器(无参)

    • 它是一个函数
    • 函数作为它的形参
    • 返回值是函数
    • 可以使用@functionname方式,简化调用
    def add(x,y):
        return x + y
    def logger(fn):
        def warpper(*args,**kwargs):
            print("args={},kwargs={}".format(args,kwargs))
            x = fn(*args,**kwargs)
            return x 
        return warpper
    
    logger(add)(4,y=5)
    

    以下add 的使用装饰器的代码

    def logger(fn):
        def warpper(*args,**kwargs):
            print("args={},kwargs={}".format(args,kwargs))
            x = fn(*args,**kwargs)
            return x 
        return warpper
    
    @logger  # add = logger(add)
    def add(x,y):
        return x + y
    
    add(4,y=5)   # logger(add)(4,y=5) - > warpper(4,y=5)
    
    

    2.装饰器(带参数)

    • 它是一个函数
    • 函数作为它的形参
    • 返回值是一个不带参的装饰器函数
    • 可以使用@functionname(参数列表)方式调用
    • 可以看作在装饰器外层又加了一层函数
    def copy_properties(fn):
        """
        将装饰器函数的属性 修改 成被装饰器装饰的函数的属性
        """
        def _copy(decorator_fn):         
            decorator_fn.__name__ = fn.__name__
            decorator_fn.__doc__ = fn.__doc__
            return decorator_fn
        return _copy
    
    def logger(fn):
        def wrapper(*args,**kwargs):
            """This is function warpper"""
            x = fn(*args,**kwargs)
            return x 
        copy_properties(fn)(wrapper)
        return wrapper
    
    @logger
    def add(x,y):
        """Thie is function add"""
        return x + y
    
    add.__doc__
    

    可以修改成如下代码

    def copy_properties(fn):
        """
        将装饰器函数的属性 修改 成被装饰器装饰的函数的属性
        """
        def _copy(decorator_fn):
            decorator_fn.__name__ = fn.__name__
            decorator_fn.__doc__ = fn.__doc__
            return decorator_fn
        return _copy
    
    def logger(fn):
         #warpper = copy_properties(fn)(wrapper)
        @copy_properties(fn)  
        def wrapper(*args,**kwargs):
            """This is function warpper"""
            x = fn(*args,**kwargs)
            return x 
        return wrapper
    
    @logger
    def add(x,y):
        """Thie is function add"""
        return x + y
    
    add.__doc__
    
    import time
    import datetime
    # 获取函数的执行时长,对时长超过阀值的函数记录
    def logger(duration):
        def _logger(fn):
            @copy_properties(fn)  # wrapper=wrapper(fn)(warpper)
            def wrapper(*args,**kwargs):
                start = datetime.datetime.now()
                ret = fn(*args,**kwargs)
                delta = (datetime.datetime.now()-start).total_seconds()
                print("so slow") if delta > duration else print('so fase')
                return ret
            return wrapper
        return _logger
    
    @logger(5)  # add= logger(5)
    def add(x,y):
        time.sleep(5)
        return x + y 
    
    print(add(5,6))
    

    相关文章

      网友评论

          本文标题:高阶函数

          本文链接:https://www.haomeiwen.com/subject/ezhziftx.html