- 译者序
- 前言
- 第1章 问答环节
- 第2章 Python 如何运行程序
- 第3章 如何运行程序
- 第4章 介绍 Python 对象类型
- 第5章 数字
- 第6章 动态类型简介
- 第7章 字符串
- 第8章 列表与字典
- 第9章 元组、文件及其他
- 第10章 Python 语句简介
- 第11章 赋值、表达式和打印
- 第12章 if 测试和语法规则
- 第13章 while 和 for 循环
- 第14章 迭代器和解析,第一部分
- 第15章 文档
- 第16章 函数基础
- 第17章 作用域
- 第18章 参数
- 第19章 函数的高级话题
- 第20章 迭代和解析,第二部分
- 第21章 模块:宏伟蓝图
- 第22章 模块代码编写基础
- 第23章 模块包
- 第24章 高级模块话题
- 第25章 OOP:宏伟蓝图
- 第27章 更多实例
- 第28章 类代码编写细节
- 第29章 运算符重载
- 第30章 类的设计
- 第31章 类的高级主题
- 第32章 异常基础
- 第34章 异常对象
- 第35章 异常的设计
- 第36章 Unicode 和字节字符串
- 字符串基础知识
- Python 的字符串类型
- 文本和二进制文件
- Python 3.0 中的字符串应用
- 转换
- 编码 Unicode 字符串
- 编码非ASCII文本
- 编码和解码非ASCII文本
- 其他 Unicode 编码技术
- 转换编码
- 在 Python 2.6 中编码 Unicode 字符串
- 源文件字符集编码声明
- 使用 Python 3.0 Bytes 对象
- 序列操作
- 创建 bytes 对象的其他方式
- 混合字符串类型
- 使用 Python 3.0(和 Python 2.6)bytearray 对象
- 使用文本文件和二进制文件
- Python 3.0 中的文本和二进制模式
- 类型和内容错误匹配
- 使用 Unicode 文件
- 在 Python 3.0 中处理 BOM
- Python 2.6 中的 Unicode 文件
- Python 3.0 中其他字符串工具的变化
- Struct二进制数据模块
- pickle对象序列化模块
- XML解析工具
- 本章小结
- 本章习题
- 习题解答
- 第37章 管理属性
- 第38章 装饰器
- 第39章 元类
- 附录A 安装和配置
- 附录B 各部分练习题的解答
- 作者介绍
- 封面介绍
字典用法注意事项
·序列运算无效。字典是映射机制,不是序列。因为字典元素间没有顺序的概念,类似串联(有序合并)和分片(提取相邻片段)这样的运算是不能用的。实际上,如果你试着这样做,Python会在你的程序运行时报错。
·对新索引赋值会添加项。当你编写字典常量时(此时的键是嵌套于常量本身的),或者向现有字典对象的新键赋值时,都会生成键。最终的结果是一样的。
·键不一定总是字符串。我们的例子中都使用字符串作为键,但任何不可变对象(也就是说,不是列表)也是可以的。例如,你可以用整数作为键,这样让字典看起来很像列表(至少进行索引时很像)。元组偶尔允许合并键值时也可以用作字典键。只要它有合适的协议方法,类实例对象(我们将在本书第六部分进行讨论)也可以用作键。大体上来讲,它需要告诉Python其值不变,否则作为固定键将会毫无用处。
使用字典模拟灵活的列表
前面的表中的最后一点非常重要,我们应举些例子来说明一下。当使用列表的时候,对在列表末尾外的偏移赋值是非法的:
虽然你可以使用重复按所需预先分配足够大的列表(例如,[0]*100),但你也可以用字典来做类似的事情,这样就不需要这样的空间分配了。使用整数键时,字典可以效仿列表在偏移赋值时增长:
在这里,看起来似乎D是一个有100项的列表,但其实是一个有单个元素的字典;键99的值是字符串'spam'。你可以像列表那样用偏移访问这一结构,但你不需要为将来可能会用到的会被赋值的所有位置都分配空间。像这样使用时,字典很像更具灵活性的列表。
字典用于稀疏数据结构
类似地,字典键也常用于实现稀疏数据结构。例如,多维数组中只有少数位置上有存储的值:
在这里,我们用字典表示一个三维数组,这个数组中只有两个位置(2,3,4)和(7,8,9)有值,其他位置都为空。键是元组,它们记录非空元素的坐标。我们并不是分配一个庞大而几乎为空的三维矩阵,而是用一个简单的两个元素的字典。通过这一方式读取空元素时,会触发键不存在的异常,因为这些元素实质上并没有存储:
避免missing-key错误
读取不存在的键的错误在稀疏矩阵中很常见,然而我们可能并不希望程序因为这一错误被关闭。在这里至少有三种方式可以让我们填入默认值而不会出现这样的错误提示:你可以在if语句中预先对键进行测试,也可以使用try语句明确地捕获并修复这一异常,还可以用我们前面介绍的get方法为不存在的键提供一个默认值:
从编程的需要方面来说,get方法是这三者中最简捷的。我们将在本书稍后部分详细介绍if和try语句。
使用字典作为“记录”
就像本书所介绍的,字典在Python中能够扮演多种角色。一般来说,字典可以取代搜索数据结构(因为用键进行索引是一种搜索操作),并且可以表示多种结构化信息的类型。例如,字典是在程序范围中多种描述某一项属性的方法之一。也就是说,它们能够扮演与其他语言中“记录”和“结构”相同的角色。
这是一个随时间通过向新键赋值来填写字典的例子:
特别是在嵌套的时候,Python的内建数据类型可以很轻松地表达结构化信息。这个例子再一次使用字典来捕获对象的属性,但它是一次性写好(并没有对每个键分别赋值),而且嵌套了一个列表和一个字典来表达结构化属性的值:
当读取嵌套对象的元素时,只要简单地把索引操作串起来就可以了:
尽管我们将来在本书第四部分学习这些类(它们既按照数据也按照逻辑分组)时,它可能比这里用做记录的用途更好,但字典是满足简单需求的一种易用的工具。
为什么要在意字典接口
除了作为一种能够在程序中通过键存储信息的简便方法之外,有些Python的扩展程序也提供了外表类似并且实际工作都和字典一样的接口。例如,Python的DBM接口通过键来获取文件,它看上去特别像一个已经打开的字典。字符串的读取都使用键索引:
稍后,我们将会看到如果你把刚才那段程序代码中的anydbm换成shelve(shelve是通过键来访问的Python持久对象的数据库),那么你也可以用这种方式储存整个Python对象。就互联网而言,Python的CGI脚本支持的一个接口看上去也跟字典类似。一个对cgi.FieldStorage范围的调用会产生一个类似字典的对象,在客户端网页上每个输入字段都有一项:
所有这些(以及字典)都是映射的例子。一旦你学习了字典接口,你就会发现字典接口适用于Python各种内置工具。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论