函数式编程提供了多种技术,用于创建简洁而富有表现力的软件。虽然 Python 不是一种纯粹的函数式编程语言,但我们可以用 Python 进行大量函数式编程。
Python 有一组核心的函数式编程特性。这让我们可以从其他函数式语言中借用许多设计模式和技术。这些借用的概念可以引导我们创建简洁优雅的程序。尤其是 Python 的生成器表达式,消除了创建大型内存数据结构的需要,从而导致程序执行速度更快,因为它们使用的资源更少。
我们不能用 Python 轻松地创建纯粹的函数式程序。Python 缺少实现这一点所需的许多特性。我们没有无限递归,例如,我们没有所有表达式的惰性计算,我们没有优化编译器。
Python 中提供了函数式编程语言的几个关键特性。其中最重要的一点是函数是一类对象。Python 还提供了许多高阶函数。内置的map()
、filter()
、functools.reduce()
功能在该角色中被广泛使用,而sorted()
、min()
、max()
等功能则不太明显。
我们将从 Python 的角度来看函数式编程的核心特性。我们的目标是从函数式编程语言中借鉴好的思想,并使用这些思想在 Python 中创建表达简洁的应用程序。
这本书是为那些希望通过借用函数式编程语言的技术和设计模式来创建简洁、富有表现力的 Python 程序的程序员编写的。有些算法可以用函数式优雅地表达;我们可以而且应该对此进行调整,使 Python 程序更具可读性和可维护性。
在某些情况下,对问题采用函数式方法也会产生极高性能的算法。Python 使创建大型中间数据结构变得太容易了,占用了内存(和处理器时间)。通过函数式编程设计模式,我们通常可以用同样具有表现力但占用更少内存和运行更快的生成器表达式替换大型列表。
第一章理解函数式编程介绍了函数式编程的一些特征技术。我们将确定一些将这些特性映射到 Python 的方法。最后,我们还将讨论在使用这些设计模式构建 Python 应用程序时,函数式编程带来的好处。
第 2 章介绍了基本的函数概念,深入探讨了函数式编程范式的六个核心特征。我们将更详细地研究每一个,以了解它们是如何在 Python 中实现的。我们还将指出函数式语言的一些特性,这些特性不适合 Python。特别是,许多函数式语言都需要复杂的类型匹配规则来支持编译和优化。
第 3 章函数、迭代器和生成器将展示如何利用不可变的 Python 对象,生成器表达式将函数编程概念适应 Python 语言。我们将介绍一些内置 Python 集合,以及如何在不偏离函数式编程概念的情况下利用它们。
第 4 章使用集合展示了如何使用大量内置 Python 函数对数据集合进行操作。本章将重点介绍一些相对简单的函数,如any()
和all()
,它们将把一组值简化为一个结果。
第 5 章高阶函数分析了常用的高阶函数,如map()
和filter()
。它还展示了许多其他高阶函数,以及我们如何创建自己的高阶函数。
第 6 章递归与归约教授如何使用递归设计算法,然后将其优化为高性能for
循环。我们还将介绍一些广泛使用的其他缩减,包括collections.Counter()
。
第 7 章附加元组技术展示了我们可以使用不可变元组(和命名元组)代替有状态对象的许多方法。不可变对象有一个简单得多的接口,我们不必担心滥用属性和将对象设置为不一致或无效状态。
第 8 章Itertools 模块检查了此标准库模块中的许多函数。此函数集合简化了编写处理集合或生成器函数的程序。
第 9 章更多 Itertools 技术介绍了 Itertools 模块中的组合函数。这些函数有些不太有用。本章包括一些例子,说明这些函数的不当使用以及组合爆炸的后果。
第 10 章Functools 模块重点介绍如何使用本模块中的一些函数进行函数编程。本模块中的一些功能更适合建筑装潢师,这些功能留给第 11 章、装潢师设计技巧。然而,其他函数提供了设计和实现函数程序的更多方法。
第 11 章装饰器设计技巧介绍如何将装饰器视为构建复合功能的一种方式。虽然这里有相当大的灵活性,但也有一些概念上的局限性:我们将研究过于复杂的装饰程序可能变得混乱而不是有用的方式。
第 12 章多进程和线程模块指出了良好功能设计的一个重要结果:我们可以分配处理工作量。使用不可变对象意味着我们不能因为同步性差的写操作而损坏对象。
第 13 章、条件表达式和运算符模块列出了一些打破 Python 严格求值顺序的方法。我们在这方面所能取得的成就是有限的。我们还将研究操作员模块,以及这如何导致对一些简单类型的处理的轻微澄清。
第 14 章脓单胞菌库分析了脓单胞菌库的一些特征。这提供了一些附加的函数编程功能。它还提供了一种了解单子更多信息的方法。在一些函数式语言中,单子是一种重要的方法,可以强制执行操作的特定顺序,这些操作可能会优化为不需要的顺序。由于 Python 已经对f表达式和语句进行了严格的排序,因此 monad 特性的指导意义大于实用意义。
第 15 章,Web 服务的功能方法,展示了我们如何将 Web 服务视为将请求转换为应答的嵌套函数集合。我们将看到如何利用函数式编程概念来构建响应迅速的动态 web 内容。
第 16 章优化和改进包括一些关于性能和优化的附加提示。我们将强调诸如记忆化之类的技术,因为它们易于实现,并且可以在正确的环境中产生显著的性能改进。
本书假定您对 Python3 和应用程序开发的一般概念有一定的了解。我们不会深入研究 Python 微妙或复杂的特性;我们将避免过多地考虑语言的内部结构。
我们假定您对函数式编程有一定的了解。由于 Python 不是函数式编程语言,因此我们无法深入研究函数式概念。我们将挑选适合 Python 的函数式编程的方面,并利用那些看起来有用的方面。
一些示例使用探索性数据分析(EDA)作为问题域,以展示函数式编程的价值。对基本概率和统计学的一些熟悉将有助于这一点。只有少数几个例子涉及到更严肃的数据科学。
您需要安装并运行 Python 3.6。有关 Python 的更多信息,请访问http://www.python.org/ 。这些示例都广泛使用了类型提示,这意味着还必须安装最新版本的mypy。
退房https://pypi.python.org/pypi/mypy 为mypy的最新版本。
在第 9 章中的例子更多的 Itertools 技术中,使用 PIL 和美丽的汤 4。原始 PIL 库的枕叉工作得很好;参见https://pypi.python.org/pypi/Pillow/2.7.0 和https://pypi.python.org/pypi/beautifulsoup4/4.6.0 。
第 14 章中的例子,PyMonad 库中使用 PyMonad;退房https://pypi.python.org/pypi/PyMonad/1.3 。
所有这些软件包都应使用以下方式安装:
$ pip install pillow beautifulsoup4 PyMonad
您可以从您的账户www.packtpub.com下载本书的示例代码文件。如果您在其他地方购买了本书,您可以访问www.packtpub.com/support并注册,将文件通过电子邮件直接发送给您。
您可以通过以下步骤下载代码文件:
- 登录或注册www.packtpub.com。
- 选择“支持”选项卡。
- 点击代码下载和勘误表。
- 在搜索框中输入图书名称,然后按照屏幕上的说明进行操作。
下载文件后,请确保使用以下最新版本解压或解压缩文件夹:
- WinRAR/7-Zip for Windows
- 适用于 Mac 的 Zipeg/iZip/UnRarX
- 适用于 Linux 的 7-Zip/PeaZip
该书的代码包也托管在 GitHub 上的https://github.com/PacktPublishing/Functional-Python-Programming-Second-Edition/ 。我们的丰富书籍和视频目录中还有其他代码包,请访问**https://github.com/PacktPublishing/** 。看看他们!
本书中使用了许多文本约定。
CodeInText
:表示文本中的码字、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 句柄。下面是一个例子:“Python 还有其他语句,比如global
或nonlocal
,它们修改特定名称空间中变量的规则。”
代码块设置如下:
s = 0
for n in range(1, 10):
if n % 3 == 0 or n % 5 == 0:
s += n
print(s)
当我们希望提请您注意代码块的特定部分时,相关行或项目以粗体显示:
s = 0
for n in range(1, 10):
if n % 3 == 0 or n % 5 == 0:
s += n
print(s)
任何命令行输入或输出的编写方式如下:
$ pip install pillow beautifulsoup4 PyMonad
粗体:表示一个新术语、一个重要单词或您在屏幕上看到的单词。例如,菜单或对话框中的单词出现在文本中,如下所示。这里有一个例子:“出于我们的目的,我们将只区分许多范例中的两种:函数式****编程和命令式****编程。”
Warnings or important notes appear like this. Tips and tricks appear like this.
我们欢迎读者的反馈。
一般反馈:发送电子邮件[email protected]
并在邮件主题中提及书名。如果您对本书的任何方面有疑问,请发送电子邮件至[email protected]
。
勘误表:尽管我们已尽一切努力确保内容的准确性,但还是会出现错误。如果您在本书中发现错误,如果您能向我们报告,我们将不胜感激。请访问www.packtpub.com/submit-errata,选择您的书籍,点击 errata 提交表单链接,然后输入详细信息。
盗版:如果您在互联网上发现我们作品的任何形式的非法复制品,请您提供我们的位置地址或网站名称,我们将不胜感激。请通过[email protected]
与我们联系,并提供该材料的链接。
如果您有兴趣成为一名作家:如果您对某个主题有专业知识,并且您有兴趣撰写或贡献一本书,请访问authors.packtpub.com。
请留下评论。一旦你阅读并使用了这本书,为什么不在你购买它的网站上留下评论呢?然后,潜在读者可以看到并使用您的无偏见意见做出购买决定,我们 Packt 可以了解您对我们产品的看法,我们的作者可以看到您对他们书籍的反馈。非常感谢。
有关 Packt 的更多信息,请访问packtpub.com。