- 译者序
- 前言
- 第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 3.0 中的字典变化
·支持一种新的字典解析表达式,这是列表和集合解析的“近亲”。
·对于D.key、D.values和D.items方法,返回可迭代的视图,而不是列表。
·由于前面一点,需要新的编码方式通过排序键来遍历。
·不再直接支持相对大小比较——取而代之的是手动比较。
·不再有D.has_key方法——相反,使用in成员关系测试。
让我们看看在Python 3.0中的字典有什么新特性。
字典解析
正如上一小节末尾提到的,Python 3.0中的字典也可以用字典解析来创建。就像我们在第5章中遇到的集合解析一样,字典解析也只在Python 3.0中可用(Python 2.6中不可用)。就像较早的时候我们在第4章中以及在本章开始简单介绍过的列表解析一样,字典解析也隐式地运行一个循环,根据每次迭代收集表达式的键/值结果,并且使用它们来填充一个新的字典。一个循环变量允许解析在过程中使用循环迭代值。
例如,在Python 2.6和Python 3.0中,动态初始化一个字典的标准方式都是:将其键和值对应起来并把结果传递给dict调用。正如我们将在本书第13章学习到的,zip函数是在一个单个调用中从键和值的列表来构建一个字典的方式之一。如果不能在代码中预计键和值的集合,总是可以将它们构建为列表然后再对应起来:
在Python 3.0中,可以用一个字典解析表达式来实现同样的效果。如下代码使用对应结果(它的样子和在Python代码中几乎相同,只不过更正式一些)中的每一个键/值对构建了一个新的字典:
这个例子中,解析实际上需要更多的代码,但是,它们也比这个例子所暗示的要更为通用——我们可以使用它们把单独的一串值映射到字典,并且键和值一样,也可以用表达式来计算:
字典解析对于从键列表来初始化字典也很有用,这和我们在前一小节末尾遇到的fromkeys方法很相似:
和相关的工具一样,字典解析支持这里没有介绍的额外的语法,包括嵌套循环和if子句。遗憾的是,要真正理解字典解析,我们还需要了解Python中有关迭代语句和概念的更多知识,并且,我们目前还没有足够的信息来介绍这些内容。我们将在第14章和第20章学习有关各种解析(列表解析、集合解析和字典解析)的更多知识,因此,稍后再介绍更多细节。我们还将在第13章中介绍循环的时候,再次学习本节中用到的zip内置函数。
字典视图
在Python 3.0中,字典的keys、values和items都返回视图对象,而在Python 2.6中,它们返回实际的结果列表。视图对象是可迭代的,这就意味着对象每次产生一个结果项,而不是在内存中立即产生结果列表。除了是可迭代的,字典视图还保持了字典成分的最初的顺序,反映字典未来的修改,并且能够支持集合操作。另一方面,它们不是列表,并且不支持像索引和列表sort方法这样的操作,打印的时候它们也不显示自己的项。
我们将在第14章更正式地讨论可迭代的概念,但是,现在只要知道这一点就够了:如果想要应用列表操作或者显示它们的值,我们必须通过内置函数list来运行这3个方法的结果:
除非在交互提示模式显示结果,我们可能很少会注意到这一改变,因为Python中的循环结构会自动迫使可迭代的对象在每次迭代上产生一个结果:
此外,Python 3.0的字典自己仍然拥有迭代器,它返回连续键——就像在Python 2.6中一样,它往往仍然没有必要直接调用keys:
然而,和Python 2.X的列表结果不同,Python 3.0中的字典视图并非创建后不能改变——它们可以动态地反映在视图对象创建之后对字典做出的修改:
字典视图和几何
与Python 2.X中的列表结果不同,keys方法所返回的Python 3.0的视图对象类似于集合,并且支持交集和并集等常见的集合操作;value s视图不是这样的,因为它们不是唯一的;但items结果是的,如果(key,value)对是唯一的并且可散列的话。由于集合的行为很像是无值的字典(并且甚至像Python 3.0中的字典一样编写在花括号中),这是一种符合逻辑的对称。就像字典键一样,集合的项是无序的、唯一的并且不可变。
如下是键列表用于集合操作中的样子。在集合操作中,视图可能与其他的视图、集合和字典混合(在这种环境中,字典与它们的键视图一样对待):
如果字典项视图是可散列的话,它们是类似于集合的——也就是说,如果它们只包含不可变的对象的话:
要了解集合操作的更多内容,参阅第5章。现在,让我们看看Python 3.0中字典的另外3个快速编码注意事项。
排序字典键
首先,由于keys不会返回一个列表,在Python 2.X中通过排序键来浏览一个字典的编码模式,在Python 3.0中并不适用。必须要么手动地转换为一个列表,要么在一个键视图或字典自身上使用第4章及本章前面介绍的sorted调用:
字典大小比较不再有效
其次,尽管在Python 2.6中可以直接用<、>等比较字典的相对大小,但在Python 3.0中这不再有效。然而,可以通过手动地比较排序后的键列表来模拟:
Python 3.0中字典相等性测试仍然有效。由于我们将在下一章详细讨论比较的时候再次回顾这一点,我们将在那里介绍更多细节。
has_key方法已死:in永生
最后,广为使用的字典has_key键存在测试方法在Python 3.0中取消了。相反,使用in成员关系表达式,或者带有默认测试的一个get(其中,in通常是首选的):
如果你使用Python 2.6并且关心Python 3.0的兼容性,注意前两个改变(解析和视图)只能在Python 3.0中编码,但后3个(排序、手动比较和in)如今可以在Python 2.6中编写并且未来很容易迁移到Python 3.0中。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论