当前位置: 首页 > news >正文

Python 一等函数( 高阶函数)

高阶函数

接受函数为参数,或者把函数作为结果返回的函数是高阶函数(higherorder
function)。map 函数就是一例,如示例 5-2 所示。此外,内置函
数 sorted 也是:可选的 key 参数用于提供一个函数,它会应用到各个
元素上进行排序,参见 2.7 节。

例如,若想根据单词的长度排序,只需把 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 2.3 中标记为过
时,在 Python 3 中移除了,因为不再需要它了。如果想使用不定量的参
数调用函数,可以编写 fn(*args, **keywords),不用再编写
apply(fn, args, kwargs)。

map、filter 和 reduce 这三个高阶函数还能见到,不过多数使用场景
下都有更好的替代品。详情参阅下一节。

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)。

示例 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。

10.6 节将深入说明 reduce 函数,我会不断改进一个示例,为这个函数
提供有意义的上下文。本书后面的 14.11 节将重点讨论可迭代对象,届
时会概述各个归约函数。

为了使用高阶函数,有时创建一次性的小型函数更便利。这便是匿名函
数存在的原因,下一节将会讨论。

http://www.xdnf.cn/news/53299.html

相关文章:

  • 【题解-OpenJudge】和为给定数
  • 【人工智能】Agent未来市场与技术潜力分析
  • Linux守护进程
  • 生成对抗网络(Generative adversarial network——GAN)
  • 【数据库】索引
  • ADVB协议
  • 软件安装,systemctl命令,软连接
  • 辅助函数构造题目(缓慢更新,遇到更道)
  • 4 Matplotlib 文字图例
  • HCIP第三次作业
  • (undone) 吴恩达版提示词工程 2. 指南
  • 【OS】深入理解Linux的五种IO模型
  • LED闪烁示例(STC89C52单片机)
  • 1001: 自由落体的计算
  • window.addEventListener 和 document.addEventListener
  • 常用的求职网站
  • 000.初识 dyld
  • nuxt3前端开发以及nuxt3和nuxt2项目的详细差异点
  • INSTEAD OF 详细介绍
  • 致迈协创C1pro考勤系统简介
  • RHCE dns实验
  • 清理C盘组合拳:最高释放空间80GB+
  • Linux 生产者消费者模型
  • C++ vector 之 【模拟实现vector须知、完整的模拟实现 】
  • 【数据结构和算法】1. 数据结构和算法简介、二分搜索
  • 使用NEAT算法探索Gymnasium中的Lunar Lander环境
  • 【AI实践】使用DeepSeek+CherryStudio绘制Mermaid格式图表
  • 深度学习4——深度神经网络训练
  • SpringBoot 基本原理
  • PowerBi如何制作KPI的总览页?