返回介绍

其他迭代环境

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

在本书后面,我们将看到用户定义的类也可以实现迭代协议。因此,有时候知道哪些内置工具使用了该协议是很重要的——实现了迭代协议的任何工具,都能够在提供了该工具的任何内置类型或用户定义的类上自动地工作。

到目前为止,我们已经在for循环语句的背景下介绍了迭代,因为本书的这一部分内容关注于语句。然而,别忘了,在对象中从左到右扫描的每种工具都使用了迭代协议。这包括我们已经介绍过的for循环:

然而,列表解析、in成员关系测试、map内置函数以及像sorted和zip调用这样的内置函数也都使用了迭代协议。当应用于一个文件时,所有这些使用文件对象的迭代器都自动地按行扫描:

我们在上一章介绍过这里所用到的map调用;它是一个内置函数,它把一个函数调用应用于传入的可迭代对象中的每一项。map类似于列表解析,但是它更有局限性,因为它需要一个函数而不是一个任意的表达式。在Python 3.0中,它还返回一个可迭代的对象自身,因此,我们必须将它包含到一个list调用中以迫使其一次性给出所有的值,关于这一修改的更多介绍,参见本章随后的内容。由于map像列表解析一样,与循环和函数都相关,我们将在第19章和第20章中再次介绍它们。

Python还包含了各种处理迭代的其他内置函数:sorted排序可迭代对象中的各项,zip组合可迭代对象中的各项,enumerate根据相对位置来配对可迭代对象中的项,filter选择一个函数为真的项,reduce针对可迭代对象中的成对的项运行一个函数。所有这些都接受一个可迭代的对象,并且在Python 3.0中,zip、enumerate和filter也像map一样返回一个可迭代对象。它们实际运行文件的迭代器会自动地按行扫描,如下所示:

所有这些都是迭代工具,但它们有独特的作用。我们在上一章见过zip和enumerate,在第19章讨论函数的时候将会介绍filter和reduce,因此,这里暂不详细介绍。

我们在第4章初次见到了在这里所用到的sorted函数,并且,我们在第8章将其用于字典。sorted是应用了迭代协议的一个内置函数,它就像是最初的列表sort方法,但是它返回一个新的排序的列表作为结果并且可以在任何可迭代对象上运行。注意,和map及其他的函数不同,sorted在Python 3.0中返回一个真正的列表而不是一个可迭代对象。

其他的内置函数也支持可迭代协议(但坦率地讲,很难用在和文件相关的有趣示例中)。例如,sum调用计算任何可迭代对象中的总数,如果一个可迭代对象中任何的或所有的项为真的时候,any和all内置函数分别返回True;max和min分别返回一个可迭代对象中最大和最小的项。和reduce一样,如下示例中的所有工具接受任何可迭代对象作为一个参数,并且使用迭代协议来扫描它,但返回单个的结果:

严格地讲,max和min函数也可以应用于文件——它们自动使用迭代协议来扫描文件,并且分别选择具有最高的和最低的字符串值的行(然而,我们把有效的用例留给你自己去想象)。

有趣的是,在当今的Python中,迭代协议甚至比我们目前所能展示的示例要更为普遍——Python的内置工具集中从左到右地扫描一个对象的每项工具,都定义为在主体对象上使用了迭代协议。这甚至包含了更高级的工具,例如list和tuple内置函数(它们从可迭代对象构建了一个新的对象),字符串join方法(它将一个子字符串放置到一个可迭代对象中包含的字符串之间),甚至包括序列赋值。总之,所有这些都将在一个打开的文件上工作并且自动一次读取一行:

早先我们也见到过内置的dict调用接受一个可迭代的zip结果。为此,我们来看看set调用,以及Python 3.0中的新的集合解析和字典解析表达式,这些我们在第4章、第5章和第8章见到过:

实际上,集合解析和字典解析都支持我们在本章前面介绍的列表解析的扩展语法,包括if测试:

和列表解析一样,这些都逐行扫描文件并且挑选以字母"p"开始的行。它们最终也恰好构建了集合和字典,但是,我们通过文件迭代和解析语法使得很多工作自动完成。

还有最后一个值得介绍的迭代环境,尽管现在介绍有点超前。在第18章中,我们将学习在函数调用中用到的一种特殊的*arg形式,它会把一个集合的值解包为单个的参数。现在我们就可以预计,它也会接受任何可迭代对象,包括文件(参见第18章了解该调用语法的更多细节):

实际上,由于调用中的参数解包语法接受可迭代对象,也可能使用zip内置函数来把zip过的元组unzip,只要对任何另一个zip调用使用之前的或嵌套的zip结果参数(警告:如果你准备在不久的任何时候运行更沉重的机制,你可能不应该阅读如下的示例):

Python中还有其他的工具,如内置函数range和字典视图对象,它们返回可迭代对象而不是处理它们。要了解这些工具是如何在Python 3.0中吸收到迭代协议中的,我们需要继续看下一节。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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