Python函数式编程(第2版)
上QQ阅读APP看书,第一时间看更新

前言

函数式编程为创建代码简洁明了的软件提供了许多技术。虽然Python不是纯粹的函数式语言,但仍然可以使用Python进行函数式编程。

Python具备函数式编程的许多核心特征,使得我们可以借鉴其他函数式语言的设计模式和编程技术,编写出简洁优雅的代码。尤其值得一提的是Python的生成器表达式,使用它可以避免在内存中创建大型数据结构,通过降低资源消耗来提高执行速度。

Python缺少创建纯粹函数式程序所需的一些语言特征,例如无限递归、针对所有表达式的惰性求值(lazy evaluation)以及优化编译器等。

函数式编程的许多核心要素都在Python中有所体现,例如函数是头等对象。Python还提供了许多典型的高阶函数,例如广泛使用的内置map()、filter()和functools.reduce()等,以及不那么明显的sorted()、min()和max()等。

本书通过Python语言诠释函数式编程的核心思想,旨在利用函数式编程的优点,编写出代码简洁明了的Python程序。


目标读者

如果你希望借鉴函数式编程语言的技术和设计模式编写出简洁明了的Python程序,本书便是为你准备的。某些算法用函数式方法编写更为简洁,我们可以也应该运用函数式方法编写出更易读且更易维护的Python程序。

可以通过函数式编程在适宜的场景中开发出高性能的算法,但Python往往会生成大型中间数据结构,耗尽机器的内存和CPU。因此常用生成器表达式代替大型列表,前者在保证可读性的前提下,内存消耗更少,运算速度更快。


本书内容

第1章:函数式编程概述,介绍Python中函数式编程对应的技术和语言特征,以及函数式设计为Python程序带来的好处。

第2章:函数式编程的特点,分析函数式编程范式的6个核心特征,以及每个特征在Python中的实现方法,还会讲到一些在Python中不易实现的函数式语言特征,例如为了支持编译优化,许多语言的类型匹配规则非常复杂。

第3章:函数、迭代器和生成器,介绍如何在Python中使用不可变对象和生成器表达式,如何将函数式编程的核心思想应用于Python和Python内置的集合类型,以及如何将函数式编程理念运用于这些数据结构。

第4章:使用集合,介绍如何使用Python的内置函数操作数据集。其中重点介绍几个比较简单的函数,例如any()和all(),它们的共同点是能将集合转换为单个值。

第5章:高阶函数,介绍一些常用的高阶函数,例如map()和filter(),以及如何创建新的高阶函数。

第6章:递归与归约,介绍如何使用递归设计算法,以及使用for循环提升性能,还会介绍其他一些应用广泛的归约函数,例如collections.Counter()。

第7章:元组处理技术,介绍使用不可变的元组和命名元组代替状态可变对象的方法。相比而言,不可变对象没有误用属性导致对象行为异常(不连续或无效)的问题,用起来更简单可靠。

第8章:itertools模块,介绍Python标准库中处理集合和生成器的几个函数,可用于简化处理集合数据的程序。

第9章:高级itertools技术,介绍itertools模块中不太常用的组合器函数,并演示错误使用这些函数导致的组合器膨胀问题。

第10章:functools模块,介绍如何将functools模块中的函数用于函数式编程。此模块中适用于构建装饰器的少数函数留待第11章讨论。本章还会介绍一些支持其他函数式编程的函数。

第11章:装饰器设计技术,介绍如何用装饰器构建复合函数。虽然使用装饰器能给程序开发带来很大的灵活性,但也有概念限制:过于复杂的装饰器非但无用,还会严重降低程序的可读性。

第12章:multiprocessing和threading模块,介绍函数式编程的一大优势:便于分流任务负载。使用不可变对象能避免设计欠佳的同步写入操作导致运行结果不可预料。

第13章:条件表达式和operator模块,介绍避开Python严格求值顺序的一些变通方法及其局限性,以及使用operator模块给某些简单的处理带来的轻微提升。

第14章:PyMonad库,介绍PyMonad库的主要特点以及更丰富的函数式编程手段,还有单子(monad)。在一些函数式语言中,代码优化会打乱某些操作的顺序,而开发者可以使用单子强制程序按照期望的顺序执行。由于Python按照严格的顺序对表达式和声明求值,因此在Python中,单子的理论研究价值高于实用价值。

第15章:Web服务的函数式设计方法。如果把Web服务看作从请求到响应的转换,那么可以把开发Web服务看作开发能实现该转换的一组函数。本章将介绍如何借助函数式编程方法构建响应式动态Web内容。

第16章:优化与改进,介绍提升程序性能的一些方法和技巧。在适合的场景中,这些方法(例如内存化)不但易于实现,并且能显著提升程序性能。


如何使用本书

阅读本书需要读者对Python 3和应用开发有基本了解。本书不会涉及Python中细微、复杂的语言特性,也不需要读者了解实现语言功能的内部机制。

读者需要对函数式编程有基本了解。由于Python不属于函数式语言,因此本书不会深入探讨函数式编程的概念,而会着重介绍其中适用于Python并有实用价值的部分。

书中的部分示例使用探索性数据分析(EDA)引出问题,演示函数式编程的特点。对统计学和概率论有基本了解有助于理解问题。只有很少一部分示例涉及数据科学。

你的计算机上需要安装并运行Python 3.6。关于Python的更多信息,请访问 http://www.python.org。本书的示例代码经常使用类型提示,所以请安装最新版本的mypy。关于最新版本的mypy,请访问https://pypi.python.org/pypi/mypy。

第9章的示例代码使用了PIL和BeautifulSoup 4。为了保持版本兼容,使用了PIL库的新分支版本Pillow代替原始PIL库,详情请访问https://pypi.python.org/pypi/Pillow/2.7.0https://pypi. python.org/pypi/beautifulsoup4/4.6.0。

第14章的示例代码使用了PyMonad库,详情请访问https://pypi.python.org/pypi/PyMonad/1.3。

可以通过如下命令安装以上所有库。

          $ pip install pillow beautifulsoup4 PyMonad


下载源代码

如果你是从http://www.packtpub.com网站购买的图书,登录自己的账号后就可以下载所有已购图书的示例代码。如果你是从其他地方购买的图书,请访问 http://www.packtpub.com/support网站并注册,我们会将代码文件直接发送到你的电子邮箱。

你也可以通过以下步骤下载代码文件。

(1)在我们的网址上登录或注册。

(2)选择SUPPORT标签。

(3)点击Code Downloads & Errata。

(4)在Search框中输入书名并按屏幕上的提示操作。

文件下载后,使用以下工具的最新版本来解压缩或提取文件夹。

❏ WinRAR / 7-Zip(Windows)

❏ Zipeg / iZip/UnRarX(Mac)

❏ 7-Zip / PeaZip(Linux)

本书代码也托管在GitHub上,访问 https://github.com/PacktPublishing/Functional-Python-Programming-Second-Edition/即可获取你可以直接访问本书中文版页面,下载本书项目的源代码:http://www.ituring.com.cn/book/2658。——编者注。Packt拥有丰富的图书和视频资源,相关代码见GitHub仓库:https://github.com/PacktPublishing/。欢迎查阅!


排版约定

本书如下约定文本样式。

正文中的代码采用以下样式:“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

新的术语重要的词语将显示为黑体。在屏幕上(如菜单或对话框中)出现的文字按如下样式显示:“在现有的许多范式中,我们重点区分函数式编程命令式编程。”

此图标表示警告或需要特别注意的内容。

此图标表示提示或技巧。


问题与反馈

一般反馈:发送邮件至feedback@packtpub.com并在主题处注明书名。如果对于本书有任何方面的疑问,请发送邮件至questions@packtpub.com。

勘误:尽管我们尽力确保内容准确,但出错仍在所难免。如果你在书中发现错误,不管是文本还是代码,希望能告知我们,我们不胜感激。针对本书中文版的勘误,请到http://www.ituring.com.cn/book/2658查看和提交。——编者注如果你发现任何错误,请访问 http://www.packtpub.com/submit-errata,选择书名,点击Errata Submission Form链接,并输入详细说明。

反盗版:如果你发现我们的作品在互联网上被以任何形式非法复制,请立即为我们提供地址或网站名称,非常感谢。请把可疑盗版材料的链接发到copyright@packtpub.com。

成为作者:如果你掌握某个领域的专业知识,并且有兴趣写作图书,请访问authors.packtpub.com。


评论

请给出评论。阅读、使用本书后,请在购买网站上留下评论。这样潜在读者可以参考你的意见来决定是否购买,Packt可以了解到你对该产品的看法,作者也能看到你对本书的反馈。谢谢!

想了解关于Packt的更多信息,请访问packtpub.com。


电子书

扫描如下二维码,即可购买本书电子版。