返回介绍

Python 3.0 中的扩展序列解包

发布于 2024-01-29 22:24:16 字数 3573 浏览 0 评论 0 收藏 0

前面小节展示了如何使用手动分片以使得序列赋值更为通用。在Python 3.0中(但不是在Python 2.6中),序列赋值变得更为通用,从而使这一过程变得容易。简而言之,一个带有单个星号的名称,可以在赋值目标中使用,以指定对于序列的一个更为通用的匹配——一个列表赋给了带星号的名称,该列表收集了序列中没有赋值给其他名称的所有项。对于前面小节的最后示例中那种把一个序列划分为其“前面”和“剩余”部分的常用编码模式,这种方法特别方便。

扩展的解包的实际应用

让我们来看一个示例。正如我们所看到的,序列赋值通常要求左边的目标名称数目与右边的主体中的项数完全一致。如果长度不同的话,将会得到一个错误(除非像前面小节所介绍的那样手动地在右边分片):

然而,在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 技术交流群。

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

发布评论

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