- 译者序
- 前言
- 第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 中的扩展序列解包
扩展的解包的实际应用
让我们来看一个示例。正如我们所看到的,序列赋值通常要求左边的目标名称数目与右边的主体中的项数完全一致。如果长度不同的话,将会得到一个错误(除非像前面小节所介绍的那样手动地在右边分片):
然而,在Python 3.0中,我们可以在目标中使用带单个星号的名称来更通用地匹配。在如下的后续交互会话中,a匹配序列中的第一项,b匹配剩下的内容:
当使用一个带星号的名称的时候,左边的目标中的项数不需要与主体序列的长度匹配。实际上,带星号的名称可以出现在目标中的任何地方。例如,在下面的交互中,b匹配序列中的最后一项,a匹配最后一项之前的所有内容:
当带星号的名称出现在中间,它收集其他列出的名称之间的所有内容。因此,在下面的交互中,第一项和最后一项分别赋给了a和c,而b获取了二者之间的所有内容:
更一般的,不管带星号的名称出现在哪里,包含该位置的每个未赋值名称的一个列表都将赋给它:
和常规的序列赋值一样,扩展的序列解包语法对于任何序列类型都有效,而不只是对列表有效。下面,它解包一个字符串中的字符:
这和分片内在的相似,但是不完全相同——一个序列解包赋值总是返回多个匹配项的一个列表,而分片把相同类型的一个序列作为分片的对象返回:
Python 3.0中有了这一扩展,我们处理前面小节的最后一个例子的列表变得容易很多了,因为我们不必手动地分片来获取第一项和剩下的项:
边界情况
尽管扩展的序列解包很灵活,一些边界情况还是值得注意。首先,带星号的名称可能只匹配单个的项,但是,总是会向其赋值一个列表:
其次,如果没有剩下的内容可以匹配带星号的名称,它会赋值一个空的列表,不管该名称出现在哪里。如下所示,a、b、c和d已经匹配了列表中的每一项,但Python会给e赋值一个空的列表,而不是将其作为错误情况对待:
最后,如果有多个带星号的名称,或者如果值少了而没有带星号的名称(像前面一样),以及如果带星号的名称自身没有编写到一个列表中,都将会引发错误:
一个有用的便利形式
记住,扩展的序列解包赋值只是一种便利形式。我们通常可以用显式的索引和分片实现同样的效果(并且实际上必须在Python 2.X中使用),但是,扩展的解包更容易编写。例如,常用的“第一个,其余的”分片编码模式可以用任何一种方式来编写,但是,分片还包括其他的工作:
常见的“剩下的,最后一项”分隔模式类似地也可以用任何一种方式来编写,但是,新的扩展解包语法显然要减少很多录入:
由于扩展的序列解包语法不仅更简单,而且更自然,这种语法可能会随着时间在Python代码中变得更广泛。
应用于for循环
由于for循环语句中的循环变量可能是任何赋值目标,扩展的序列赋值在这里也有效。我们在本书第二部分简单介绍了for循环迭代工具,并且将在第13章中正式地学习它。在Python 3.0中,扩展赋值可能出现在单词for之后,而更常见的用法是一个简单的变量名称:
当在这种环境中使用的时候,在每次迭代中,Python直接把下一个值的元组分配给名称的元组。例如,在第一次循环中,就好像我们运行如下的赋值语句:
名称a、b和c可以在循环的代码中用来引用提取的部分。实际上,这真的不是特殊情况,只是通用的赋值用法的一种情况。正如我们在本章前面所见到的,在Python 2.X和Python 3.X中,我们都可以使用简单的元组赋值做同样的事情:
我们总是可以在Python 2.6中使用手动分片来模拟Python 3.0的扩展赋值行为:
在第13章中,我们已经学习了足够多的知识以了解有关for循环语法的更多细节,那时候我们还将返回来讨论这一话题。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论