当前位置: 首页 > 科技观察

Python编程:迭代器协议与遍历,轻松搞定

时间:2023-03-14 17:49:11 科技观察

前言前面内容的介绍,应该能让我们更容易理解和掌握Python中的可迭代对象和迭代器(Iterable&Iterator)。在本篇内容中,我们将进一步介绍迭代器的相关内容。迭代器协议在Python中,迭代器(Iterator)对象需要支持以下两种方法,它们共同构成了迭代器协议:1)__iter__():该对象的方法返回迭代器对象本身。这是要求容器和迭代器与for-in语句一起使用所必需的。您还可以使用内置的iter()函数,它实质上是在幕后调用__iter__()方法。2)__next__():返回迭代器的下一个项目。如果没有更多项目,则抛出StopIteration异常。您还可以使用内置的next()函数来读取下一项,这实际上是调用__next__()方法。正如我们之前所说,列表、元组、字典和集合都是可迭代的类型。换句话说,它们是可以从中获得迭代器的类型。看例子:代码片段Listing-01输入结果如下:ABC在示例代码中,我们定义了一个可迭代的元组。然后在这个可迭代对象上调用iter()函数。iter()函数返回一个迭代器,我们将其命名为tupIter。然后多次调用next()函数。next()函数在每次执行时自动返回迭代器中的下一项。看下一段示例代码:代码snippet-02运行输出的结果是:Py在上面的代码清单中调用string对象的__iter__()方法。字符串对象实现迭代器协议,因此字符串是包含字符序列的可迭代对象。调用__iter__()方法直接返回一个迭代器。然后通过返回的迭代器调用__next__()方法,将迭代器中元素的内容一一输出。总之,只要实现了迭代器协议的对象,就可以按照上面两种方法进行对象的迭代调用。迭代器遍历正如我们在前面的介绍中看到的,我们使用next()函数(或__next__()方法)手动遍历迭代器的项。当next()函数到达迭代器的末尾时,没有更多数据可返回,您将得到StopIteration异常。请看例子:CodeSnippetList-03运行上面的程序,输出类似如下:102030Traceback(mostrecentcalllast):File...,inprint(next(listIter))StopIteration中上面的代码,next被调用了四次()函数,这比迭代器中的项数还多。在上次调用中抛出StopIteration异常-因为迭代器中的元素已被迭代。而且,为了保证手动迭代完成后可能抛出的异常,必须自己进行异常处理,否则后面的执行将不再正常。需要意识到的是,在大多数场景下,我们不需要自己手动调用next方法。Python中的for循环可以自动遍历任何可以返回迭代器的对象。换句话说,for循环可以遍历Python中的任何可迭代对象。请参阅示例:代码清单片段04在上面的代码中,我们使用for循环遍历之前定义的列表。显然,我们没有手动使用next()函数,也没有得到任何StopIteration异常。这就是Python中for循环的美妙之处。它在幕后为我们处理所有这一切。当然,我们自己也可以这样处理循环迭代。现在定义我们自己的for循环版本。我们将使用while循环并复制for循环的行为。在这里,我们自己构建此实现所需的一切。如下所示:代码清单Fragment-05在上面的清单中,我们已经实现了我们自己的模拟for循环版本。代码中使用了一个无限循环:whileTrue。在循环内设置一个try-except块。在try块内,下一个元素是通过调用迭代器上的__next__()方法获得的。如果调用成功,则打印出该元素。如果发生StopIteration类型的错误,则在except块中捕获异常。您在except块中执行的操作非常简单。我们刚刚跳出这个循环,这意味着我们已经到了迭代器的末尾。小结本文就这些了,主要介绍迭代器协议和迭代器遍历。内容文字不长,结合代码可以帮助大家更好的理解和掌握这些Python编程知识点。