返回介绍

3.11 延伸阅读

发布于 2024-02-05 21:59:48 字数 2434 浏览 0 评论 0 收藏 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文