• 高阶函数


    接受函数为参数,或者把函数作为结果返回的函数是高阶函数(higherorder function)。map 函数就是一例,如示例 5-2 所示。此外,内置函数 sorted 也是:可选的 key 参数用于提供一个函数,它会应用到各个元素上进行排序。
    例如,若想根据单词的长度排序,只需把 len 函数传给 key 参数,如示例 5-3 所示。
      示例 5-3 根据单词长度给一个列表排序
    >>> fruits = ['strawberry', 'fig', 'apple', 'cherry', 'raspberry','banana']
    >>> sorted(fruits, key=len)
    ['fig', 'apple', 'cherry', 'banana', 'raspberry', 'strawberry']
    >>>
    任何单参数函数都能作为 key 参数的值。例如,为了创建押韵词典,可以把各个单词反过来拼写,然后排序。注意,示例 5-4 中列表里的单词没有变,我们只是把反向拼写当作排序条件,因此各种浆果(berry)都排在一起。
      示例 5-4 根据反向拼写给一个单词列表排序
    >>> def reverse(word):
    ...   return word[::-1]
    >>> reverse('testing')
    'gnitset'
    >>> sorted(fruits, key=reverse)
    ['banana', 'apple', 'fig', 'raspberry', 'strawberry', 'cherry']
    >>>
    在函数式编程范式中,最为人熟知的高阶函数有map、filter、reduce 和 apply。apply在 Python 3 中移除了,因为不再需要它了。如果想使用不定量的参数调用函数,可以编写 fn(*args, **keywords),不用再编写apply(fn, args, kwargs)。
     
    map、filter和reduce的现代替代品
     
    函数式语言通常会提供 map、filter 和 reduce 三个高阶函数(有时使用不同的名称)。在 Python 3 中,map 和 filter 还是内置函数,但是由于引入了列表推导和生成器表达式,它们变得没那么重要了。列表推导或生成器表达式具有 map 和 filter 两个函数的功能,而且更易于阅读,如示例 5-5 所示。
      示例 5-5 计算阶乘列表:map 和 filter 与列表推导比较
    >>> list(map(fact, range(6))) ➊
    [1, 1, 2, 6, 24, 120]
    >>> [fact(n) for n in range(6)] ➋
    [1, 1, 2, 6, 24, 120]
    >>> list(map(factorial, filter(lambda n: n % 2, range(6)))) ➌
    [1, 6, 120]
    >>> [factorial(n) for n in range(6) if n % 2] ➍
    [1, 6, 120]
    >>>
    ❶ 构建 0! 到 5! 的一个阶乘列表。
    ❷ 使用列表推导执行相同的操作。
    ❸ 使用 map 和 filter 计算直到 5! 的奇数阶乘列表。
    ❹ 使用列表推导做相同的工作,换掉 map 和 filter,并避免了使用lambda 表达式。
    在 Python 3 中,map 和 filter 返回生成器(一种迭代器),因此现在它们的直接替代品是生成器表达式(在 Python 2 中,这两个函数返回列表,因此最接近的替代品是列表推导)。
    在 Python 2 中,reduce 是内置函数,但是在 Python 3 中放到functools 模块里了。这个函数最常用于求和,自 2003 年发布的Python 2.3 开始,最好使用内置的 sum 函数。在可读性和性能方面,这是一项重大改善
     示例 5-6 使用 reduce 和 sum 计算 0~99 之和
    >>> from functools import reduce ➊
    >>> from operator import add ➋
    >>> reduce(add, range(100)) ➌
    4950
    >>> sum(range(100)) ➍
    4950
    >>>
    ❶ 从 Python 3.0 起,reduce 不再是内置函数了。
    ❷ 导入 add,以免创建一个专求两数之和的函数。
    ❸ 计算 0~99 之和。
    ❹ 使用 sum 做相同的求和;无需导入或创建求和函数。
    sum 和 reduce 的通用思想是把某个操作连续应用到序列的元素上,累计之前的结果,把一系列值归约成一个值。
    all 和 any 也是内置的归约函数。
     
    all(iterable)
    如果 iterable 的每个元素都是真值,返回 True;all([]) 返回True。
    any(iterable)
    只要 iterable 中有元素是真值,就返回 True;any([]) 返回False。
     
     
     
    人生就是要不断折腾
  • 相关阅读:
    Java基础之集合Collection一:
    Java基础之字符串String:
    Java基础之Map学习代码示例二:
    Jav基础之字符串缓冲区StringBuffer:
    Java基础之TreeSet集合使用泛型、比较器排序示例:
    Java基础之Map学习代码示例一:
    Java基础之StringBuilder
    Java基础之泛型限定的使用示例:
    Java基础之泛型的应用
    spark.primitives 包中的几个基本类
  • 原文地址:https://www.cnblogs.com/xiangxiaolin/p/11606401.html
Copyright © 2020-2023  润新知