- 前言
- 目标读者
- 非目标读者
- 本书的结构
- 以实践为基础
- 硬件
- 杂谈:个人的一点看法
- Python 术语表
- Python 版本表
- 排版约定
- 使用代码示例
- 第一部分 序幕
- 第 1 章 Python 数据模型
- 第二部分 数据结构
- 第 2 章 序列构成的数组
- 第 3 章 字典和集合
- 第 4 章 文本和字节序列
- 第三部分 把函数视作对象
- 第 5 章 一等函数
- 第 6 章 使用一等函数实现设计模式
- 第 7 章 函数装饰器和闭包
- 第四部分 面向对象惯用法
- 第 8 章 对象引用、可变性和垃圾回收
- 第 9 章 符合 Python 风格的对象
- 第 10 章 序列的修改、散列和切片
- 第 11 章 接口:从协议到抽象基类
- 第 12 章 继承的优缺点
- 第 13 章 正确重载运算符
- 第五部分 控制流程
- 第 14 章 可迭代的对象、迭代器和生成器
- 14.1 Sentence 类第1版:单词序列
- 14.2 可迭代的对象与迭代器的对比
- 14.3 Sentence 类第2版:典型的迭代器
- 14.4 Sentence 类第3版:生成器函数
- 14.5 Sentence 类第4版:惰性实现
- 14.6 Sentence 类第5版:生成器表达式
- 14.7 何时使用生成器表达式
- 14.8 另一个示例:等差数列生成器
- 14.9 标准库中的生成器函数
- 14.10 Python 3.3 中新出现的句法:yield from
- 14.11 可迭代的归约函数
- 14.12 深入分析 iter 函数
- 14.13 案例分析:在数据库转换工具中使用生成器
- 14.14 把生成器当成协程
- 14.15 本章小结
- 14.16 延伸阅读
- 第 15 章 上下文管理器和 else 块
- 第 16 章 协程
- 第 17 章 使用期物处理并发
- 第 18 章 使用 asyncio 包处理并发
- 第六部分 元编程
- 第 19 章 动态属性和特性
- 第 20 章 属性描述符
- 第 21 章 类元编程
- 结语
- 延伸阅读
- 附录 A 辅助脚本
- Python 术语表
- 作者简介
- 关于封面
3.11 延伸阅读
Python 标准库中的“8.3. collections—Container datatypes”一节提到了关于一些映射类型的例子和使用技巧。如果想要创建新的映射类型,或者是体会一下现有的映射类型的实现方式,Python 模块 Lib/collections/__init__.py 的源码是一个很好的参考。
《Python Cookbook(第 3 版)中文版》(David Beazley 和 Brian K. Jones 著)的第 1 章中有 20 个关于数据结构的使用技巧,大多数都在讲 dict 的巧妙用法。
“Python 的字典类:如何打造全能战士”是《代码之美》第 18 章的标题,这一章集中解释了 Python 字典背后的工作原理。A.M. Kuchling 是这一章的作者,同时他还是 Python 的核心开发者,并撰写了很多 Python 的官方文档和指南。同时 CPython 模块里的 dictobject.c 源文件还提供了大量的注释。Brandon Craig Rhodes 的讲座“The Mighty Dictionary”对散列表做了很精彩的讲解,有趣的是他的幻灯片里也包含了大量的表格。
关于为什么要在语言里加入集合这种数据类型,当初也是有一番考量的。具体情况在“PEP 218 — Adding a Built-In Set Object Type”中有所记录。在 PEP 128 刚刚通过的时候,还没有针对 set 的特殊字面量句法。后来 Python 3 里加入了对 set 字面量句法的支持,然后这个实现又被向后兼容到了 Python 2.7 里,同时被移植的还有 dict 和 set 推导。“PEP 274 — Dict Comprehensions”就是字典推导的出生证;然而我找不到任何关于集合推导的 PEP,当然很有可能是因为这两个功能太接近了。
杂谈
我的朋友 Geraldo Cohen 曾经说过,Python 的特点是“简单而正确”。
dict 类型正是这一特点的完美体现——对它的优化只为一个目标:更好地实现对随机键的读取。而优化的结果非常好,由于速度快而且够健壮,它大量地应用于 Python 的解释器当中。如果对排序有要求,那么还可以选择OrderedDict。然而对于映射类型来说,保持元素的顺序并不是一个常用需求,因此会把它排除在核心功能之外,而以标准库的形式提供其他衍生的类型。
与之形成鲜明对比的是 PHP。在 PHP 手册中,数组的描述如下:
PHP 中的数组实际上是一个有序的映射——映射类型存放的是键值对。这个映射类型被优化为可充当不同的角色。它可以当作数组、列表(向量)、散列表(映射类型的一种实现)、字典、集合类型、栈、队列或其他可能的数据类型。
单凭这段话,我无法想象 PHP 把 list 和 OrderedDict 混合实现的成本有多大。
本书前两章的目的是展示 Python 中的集合类型为特定的使用场景做了怎样的优化。我特意强调了在 list 和 dict 的常规用法之外还有那些特殊的使用情景。
在遇到 Python 之前,我主要使用 Perl、PHP 和 JavaScript 做网站开发。我很喜欢这些语言中跟映射类型相关的字面量句法特性。某些时候我不得不使用 Java 和 C,然后我就会疯狂地想念这些特性。好用的映射类型的字面量句法可以帮助开发者轻松实现配置和表格相关的开发,也能让我们很方便地为原型开发或者测试准备好数据容器。 Java 由于没有这个特性,不得不用复杂且冗长的 XML 来替代。
JSON 被当作“瘦身版 XML”。在很多情景下,JSON 都成功取代了 XML。由于拥有紧凑的列表和字典表达,JSON 格式可以完美地用于数据交换。
PHP 和 Ruby 的散列语法借鉴了 Perl,它们都用 => 作为键和值的连接。JavaScript 则从 Python 那儿偷师,使用了 :。而 JSON 又从 JavaScript 发展而来,它的语法正好是 Python 句法的子集。因此,除了在 true、false 和 null 这几个值的拼写上有出入之外,JSON 和 Python 是完全兼容的。于是,现在大家用来交换数据的格式全是 Python 的 dict 和 list。
简单而正确。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论