美文网首页
高阶函数

高阶函数

作者: 秋幻旎苏 | 来源:发表于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))

相关文章

  • python学习(三)函数式编程

    高阶函数 函数也是变量,函数参数为函数的函数,称作高阶函数 自定义高阶函数 内建高阶函数 map/reducema...

  • 11.Lambda和高阶函数(Lambda and Higher

    高阶函数 kotlin_Lambda,高阶函数 *swift_高阶函数

  • Python | 高阶函数基本应用及Decorator装饰器

    一、高阶函数 理解什么是高阶函数?以及高阶函数的基本应用方法 ▲ 高阶函数 在了解什么是高阶函数之前,我们来看几个...

  • 四、函数进阶

    一. 高阶函数 参数类型包含函数类型或返回值类型为函数类型的函数为高阶函数。 常见的高阶函数 高阶函数的调用 二....

  • Kotlin 高阶函数

    什么是高阶函数 将函数作为参数或者返回值的,称高阶函数。 定义高阶函数 action是一个高阶函数,(Int) -...

  • 高阶组件

    高阶组件 先来引入这个概念 高阶函数是什么? 高阶函数就是一个函数返回一个函数eg: 高阶组件 类同 高阶组件就是...

  • [JS函数] (Array)の高阶函数

    JS函数 高阶函数 高阶函数英文叫Higher-order function。那么什么是高阶函数? JavaScr...

  • HOC - High Order Component 高阶组件

    高阶函数 简而言之,可以接收函数作为参数的函数就是一个高阶函数。 上面的hoc函数就是一个高阶函数。 高阶组件 高...

  • Day10. 高阶组件

    1. 认识高阶函数 什么是高阶组件呢?认识高阶函数.png 高阶函数: 接收一个或多个函数作为输入, 输出一个函数...

  • Python高阶函数

    本文要点 1.什么是高阶函数 2.python中有哪些常用的高阶函数 什么是高阶函数? 在了解什么是高阶函数之前,...

网友评论

      本文标题:高阶函数

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