python经典书籍必看:流畅的Python
作者:熊猫烧香
链接:www.pythonheidong.com/blog/article/26/
来源: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经典书籍推荐:Python核心编程
作者:熊猫烧香 链接:www.pythonheidong.com/blog/article/27/ 来源:python黑洞网 对<Python核心编程>的褒奖 “ The long-awa ...
- python经典书籍:Python编程实战 运用设计模式、并发和程序库创建高质量程序
Python编程实战主要关注了四个方面 即:优雅编码设计模式.通过并发和编译后的Python(Cython)使处理速度更快.高层联网和图像.书中展示了在Python中已经过验证有用的设计模式,用专家级 ...
- 10个步骤教你如何安装Anaconda安装,Python数据分析入门必看
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:小白 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行 ...
- python必看经典书籍:笨办法学python
书评: 感谢作者和译者,很好的手把手的一个新手编程体验书,消除编程物质恐惧感,在线看的liam huang翻译的版,不确定看的是第几版,有一些加分题没有做,第五十题黑手党外星人飞船做起来有点压力,准备 ...
- Python 爬虫工程师必看,深入解读字体反爬虫
字体反爬虫开篇概述 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人 ...
- python经典书籍推荐:python编码规范
目录INF-qa Python 编码规范................................................................................ ...
- 小白必看Python视频基础教程
Python的排名从去年开始就借助人工智能持续上升,现在它已经成为了第一名.Python的火热,也带动了工程师们的就业热.可能你也想通过学习加入这个炙手可热的行业,可以看看Python视频基础教程,小 ...
- 多本Python极速入门最佳书籍,不可错过的Python学习资料!
Python作为现在很热门的一门编程语言,介于Python的友好,许多的初学者都将其作为首选,为了帮助大家更好的学习Python,我筛选了2年内优秀的python书籍,个别经典的书籍扩展到5年内. ...
- 学习Python的书籍——入门到进阶
入门读物 <Python基础教程>(Beginning Python From Novice to Professional) <Python学习手册>(Learning Py ...
随机推荐
- 【XSY2988】取石子 博弈论
题目描述 有 \(n\) 堆石子,每堆石子的个数是 \(c_i\). Alice 和 Bob 轮流取石子(先后手未定),Alice 每次从一堆中取 \(a\) 个,Bob每次从一堆中取 \(b\) 个 ...
- bash 字符串处理
bash 字符串处理 字符串切片:${var:offset:length}示例:[root@localhost ~]#mypath="/etc/sysconfig/network-scrip ...
- java-查看java源码
安装jdk后,自己的pc下自然而然就可以找到java的源码包.
- Pandas系列(九)-分组聚合详解
目录 1. 将对象分割成组 1.1 关闭排序 1.2 选择列 1.3 遍历分组 1.4 选择一个组 2. 聚合 2.1 一次应用多个聚合操作 2.2 对DataFrame列应用不同的聚合操作 3. t ...
- Python装饰器的进阶
带参数的装饰器 示例一:Python自带的装饰器函数 from functools import wraps import time def Time(func1): @wraps(func1) de ...
- 金融量化分析【day110】:金融基础知识
一.股票 股票: 股票是股份公司发给出资人的一种凭证,股票的持有者就是股份公司的股东. 股票的面值与市值 面值表示票面金额 市值表示市场价值 上市/IPO: 企业通过证券交易所公开向社会增发股票以募集 ...
- Entity Framework入门教程(9)---离线场景附加实体图集到上下文
附加离线实体图集到上下文 这节主要内容是通过不同的方法将离线实体附加到上下文中. 在离线场景中,保存一个实体要略微困难一些.当我们保存一个离线的实体图集或一个单独的离线实体时,我们需要做两件事.首先, ...
- BFC块级格式化上下文
BFC块级格式化上下文 触发条件 overflow 值不为 visible 的块元素 根元素 html 元素 浮动元素(元素的 float 不是 none) 绝对定位元素(元素的 position 为 ...
- [物理学与PDEs]第2章第2节 粘性流体力学方程组 2.5 粘性热传导流体动力学方程组的数学结构
1. 粘性热传导流体动力学方程组可化为 $$\beex \bea \cfrac{\p \rho}{\p t}&+({\bf u}\cdot\n)\rho=-\rho \Div{\bf u}, ...
- 消息队列MQ对比
1.ActiveMQ 是Apache下的一个子项目. 类似于ZeroMQ,它能够以代理人和点对点的技术实现队列.同时类似于RabbitMQ,它少量代码就可以高效地实现高级应用场景.RabbitMQ.Z ...