python经典书籍必看:流畅的Python
作者:熊猫烧香
链接:
来源:python黑洞网
目标读者
本书的目标读者是那些正在使用 python,又想熟悉 python 3 的程序员。
如果你懂 python 2,但是想迁移到 python 3.4 或者更新的版本,也没问
题。在写这本书的时候,大多数专业 python 程序员用的还是 python 2,
因此如果书中出现来自 python 3 的特性,读者可能会感到陌生,我也会
特别地做出解释。
然而,本书的主要目的是为了充分地展现 python 3.4 的魅力,因此我不
会一字一句地说明如何让本书的代码在旧版本里正常运行。本书中的大
多数例子稍做修改(甚至不用修改)就可以在 python 2.7 里面跑起来,
但是有些例子,如果追求向下兼容,就会需要大量的重写。
话虽如此,我还是认为,即便你无法从 python 2.7 里脱身,这本书也会
对你很有帮助,因为 pyhon 语言的核心概念是不会变的。python 3 也不
是一门全新的语言,大多数的改动花一下午大概就能适应,官方文档
里“python 3.0 的新特性”一节
(https://docs.python.org/3.0/whatsnew/3.0.html)就是很好的切入点。固
然,自 2009 年发布以来,python 3.0 也在变化,但是这些变化比起
python 3.0 和 python 2.0 之间的区别,并没有那么重要。
如果你尚不清楚自己对 python 的熟悉程度能否跟得上本书的内容,建议
你回头看看 python 的官方教程。注意,除非是跟 python 3 的新特性有
关,教程里的其他内容本书不会重复。
非目标读者
如果你才刚刚开始学 python,本书的内容可能会显得有些“超纲”。比难
懂更糟的是,如果在学习 python 的过程中过早接触本书的内容,你可能
会误以为所有的 python 代码都应该利用特殊方法和元编程
(metaprogramming)技巧。我们知道,不成熟的抽象和过早的优化一
样,都会坏事。
本书的结构
如果你是本书的目标读者,那你应该可以从本书的任意一章开始阅读,
但是如果按照我写作时的构思来的话,本书一共分为六个独立的部分,
每个部分内的章节最好按照顺序来读。
在介绍让你自己实现某些功能的方法之前,我通常会先把现成可用的工
具讲清楚。比如说第二部分的第 2 章覆盖了序列类型(sequence
type),但是像 collections.deque 这种类可能就会一带而过。一直
到第四部分,我们才会看看如何从抽象基类(abstract base class,
abc)中获利,抽象基类则被封装在 collections.abc 这个包里。如
果想创建自己的 abc,你可能得看到第四部分的最后一些内容才行,
因为我一直觉得,如果没有熟练使用 abc 的经验,贸然去实现一套自
己的东西是不合适的。
这样做有几个好处。第一,知道有什么现成的工具可用,能避免重新发
明*。毕竟我们使用现有集合类型(collection type)的概率要远大于
自己动手写一套新的。第二,这样一来,在讨论如何写新类型之前,我
们能够有更多的机会来了解这些现成类的高级用法。第三,比起从零开
始构建一个 abc,继承已有的 abc 库应该会简单一些。最后,我认为
在看过一些实际的案例之后,理解抽象会更轻松。
当然,这样也会带来一些不便之处,比如书里的向前引用就会分散在各
个不同的章节里面。但是经过上述这番梳理,我想这一点不便之处也是
可以容忍的。
下面是本书每一部分的主题。
第一部分
第一部分只有单独的一章,讲解的是 python 的数据模型(data
model),以及如何为了保证行为一致性而使用特殊方法(比如
__repr__),毕竟 python 的一致性是出了名的。其实整本书几乎都是
在讲解 python 的数据模型,第 1 章算是一个概览。
第二部分
第二部分包含了各种集合类型:序列(sequence)、映射
(mapping)和集合(set),另外还提及了字符串(str)和字节序列
(bytes)的区分。说起来,最后这一点也是让亲者(python 3 用户)
快,仇者(python 2 用户)痛的一个关键,因为这个区分致使 python 2
代码迁移到 python 3 的难度陡增。第二部分的目标是帮助读者回忆起
python 内置的类库,顺带解释这些类库的一些不太直观的地方。具体的
例子有 python 3 如何在我们观察不到的地方对 dict 的键重新排序,或
者是排序有区域(locale)依赖的字符串时的注意事项。为了达到本部
分的目标,有些地方的讲解会比较大而全,像序列类型和映射类型的变
种就是这样;有时则会写得很深入,比方说我会对 dict 和 set 底层的
散列表进行深层次的讨论。
第三部分
如何把函数作为一等对象(first-order object)来使用。第三部分首
先会解释前面这句话是什么意思,然后话题延伸到这个概念对那些被广
泛使用的设计模型的影响,最后读者会看到如何利用闭包(closure)的
概念来实现函数装饰器(function decorator)。这一部分的话题还包括
python 的这些基本概念:可调用(callable)、函数属性(function
attribute)、内省(introspection)、参数注解(parameter annotation)和
python 3 里新出现的 nonlocal 声明。
第四部分
到了这里,书的重点转移到了类的构建上面。虽然在第二部分里的
例子里就有类声明(class declaration)的出现,但是第四部分会呈现更
多的类。和任何面向对象语言一样,python 还有些自己的特性,这些特
性可能并不会出现在你我学习基于类的编程的语言中。这一部分的章节
解释了引用(reference)的原理、“可变性”的概念、实例的生命周期、
如何构建自定义的集合类型和 abc、多重继承该怎么理顺、什么时候
应该使用操作符重载及其方法。
第五部分
python 中有些结构和库不再满足于诸如条件判断、循环和子程序
(subroutine)之类的顺序控制流程,第五部分的笔墨会集中在这些构造
和库上。我们会从生成器(generator)起步,然后话题会转移到上下文
管理器(context manager)和协程(coroutine),其中会涵盖新增的功能
强大但又不容易理解的 yield from 语法。这一部分以并发性和面向事
件的 i/o 来结尾,其中跟并发性相关的是 collections.futures 这个
很新的包,它借助 futures 包把线程和进程的概念给封装了起来;而
跟面向事件 i/o 相关的则是 asyncio,它的背后是基于协程和 yield
from 的 futures 包。
第六部分
第六部分的开头会讲到如何动态创建带属性的类,用以处理诸如
json 这类半结构化的数据。然后会从大家已经熟悉的特性(property)
机制入手,用描述符从底层来解释 python 对象属性的存取。同时,函
数、方法和描述符的关系也会被梳理一遍。第六部分会从头至尾地实现
一个字段验证器,在这个过程中我们会遇到一些微妙的问题,然后在最
后一章中就自然引出像类装饰器(class decorator)和元类(metaclass)
这些高级的概念。
以实践为基础
一般情况下,我们会用 python 的交互式控制台来探索各种库和语言本
身。有些读者可能对静态的需要编译的语言更熟悉,但是这些语言可能
不会提供 repl(read-eval-print loop,读取、求值、输出的循环)。在
这里我想强调一下 python 交互式控制台,也就是 repl,作为一个学习
工具的重要性。
doctest(https://docs.python.org/3/library/doctest.html)是 python 的一个标
准库,做测试用的。这个库通过模拟控制台对话来检验表达式求值是否
正确,而本书中几乎所有代码的测试,包括那些在控制台里的输出,都
是通过这个库来进行的。doctest 看起来就像是 python 交互式控制台的剧
本,你甚至都不需要了解它背后的运行机制就可以直接用它来试验书里
的例子。
我有时为了事先说明一段代码的目的,会在展示代码之前先摆出相应的
doctest 文本。这是因为我认为,在考虑如何实现一个功能之前,先严格
地列出这个功能能做什么,这能帮助我们在编程时把精力花在该花的地
方。测试驱动开发(tdd)的精髓就是先写测试,我后来发现这种精神
在教学中也是大有益处的。如果你对 doctest 还不熟悉,花点时间阅读
它的文档(https://docs.python.org/3/library/doctest.html)。结合本书的源
码(https://github.com/fluentpython/example-code),你可以在操作系统的
控制台里键入 python3 -m doctest example_script.py 来验证书
中几乎所有代码的正确性。
硬件
书中有一些简单的时间和基准测试,跑这些测试的时候我用的是写书时
的两台笔记本电脑。一台是产于 2011 年的 macbook pro 13 英寸笔记
本,配置是 2.7 ghz 的英特尔 core i7 处理器、8gb 的内存和机械硬
盘;另一台是产于 2014 年的 macbook air 13 英寸笔记本,配置是 1.4
ghz 的英特尔 core i5 处理器、4gb 内存和一个固态硬盘。macbook air
的处理器虽然慢一些,内存也没有另一台多,但是它的内存快一些
(1600 mhz,macbook pro 13 英寸则是 1333 mhz),另外它的硬盘也
更快,因此在日常使用中我并没有感觉到两台笔记本有速度上的差异。
杂谈:个人的一点看法
从 1998 年起,我一直在使用 python,也做 python 教学,另外还一直在
为它辩护。我一直都很享受这个过程,尤其是喜欢研究 python 同其他语
言在设计和理论上的不同。因此在有些章节的最后,我会加上一点自己
对 python 以及其他语言的看法,我把这部分叫作“杂谈”。如果你对这些
东西不感兴趣,跳过即可,因为这些并不是必读的。
第 1 章 python 数据模型
第 2 章 序列构成的数组
第 3 章 字典和集合
第 4 章 文本和字节序列
第 5 章 一等函数
第 6 章 使用一等函数实现设计模
式
第 7 章 函数装饰器和闭包
第 8 章 对象引用、可变性和垃圾
回收
第 9 章 符合python风格的对象
第 10 章 序列的修改、散列和切
片
第 11 章 接口:从协议到抽象基
类
第 12 章 继承的优缺点
第 13 章 正确重载运算符
第 14 章 可迭代的对象、迭代器
和生成器
第 15 章 上下文管理器和 else 块
第 16 章 协程
第 17 章 使用期物处理并发
第 18 章 使用 asyncio 包处理并
发
第 19 章 动态属性和特性
第 20 章 属性描述符
第 21 章 类元编程
推荐阅读
-
python经典书籍必看:流畅的Python
-
通过抓取淘宝评论为例讲解Python爬取ajax动态生成的数据(经典)
-
Python实现的朴素贝叶斯算法经典示例【测试可用】
-
Python使用matplotlib和pandas实现的画图操作【经典示例】
-
Python 入门必学经典知识点笔记【肯定有你不知道的】
-
Python3获取豆瓣图书标签的前20本热门书籍(一)
-
PYTHON爬虫大作业:豆瓣读书“小说”标签下1000本书籍的爬取与分析
-
荐 【流畅的python】笔记(C14可迭代的对象、迭代器和生成器)自测知识点和书籍补充
-
python经典书籍推荐:python编码规范
-
python经典书籍必看:流畅的Python