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

Python可迭代对象和迭代器的比较

时间:2023-03-12 01:44:29 科技观察

什么是迭代?迭代是指按需一次获取一个数据。是否可以迭代,可以简单的通过是否可以使用for循环值来判断。更准确的判断是使用iter()函数,它是Python的内建函数。可迭代对象iter()函数的工作原理如下:如果对象实现了__iter__方法,则调用它得到一个迭代器。例如:def__iter__(self):returnSentenceIterator(self.words)如果对象没有实现__iter__但实现了__getitem__方法,则创建一个迭代器并尝试从索引0获取元素。如果尝试获取元素失败,抛出TypeError异常。可迭代对象是通过iter()函数判断出来的,满足前面2点的对象。任何Python序列都是可迭代的,因为它们都实现了__getitem__方法。迭代器可以从前面的iter()函数中找到,迭代器是从可迭代对象中获取的。如果对象本身是可迭代的,则调用__iter__方法获取迭代器。如果该对象不可迭代但实现了__getitem__方法,则会创建一个迭代器。例如,您可以使用iter()函数将列表转换为迭代器:>>>test_list=[1,2,3]>>>print(type(test_list))>>>test_iter=iter(test_list)>>>print(type(test_iter))迭代器可以使用for循环遍历:forxintest_iter:print(x)也可以使用while循环遍历:whileTrue:try:print(next(test_iter))exceptStopIteration:deltest_iterbreaknext()函数用于获取迭代器的下一个元素。当没有更多元素时,迭代器将抛出StopIteration异常。标准迭代器接口有两个方法:__next__返回下一个元素。__iter__返回self以便在应该使用可迭代对象的地方使用迭代器,例如在for循环中。def__iter__(self):returnsself迭代器的确切定义是:迭代器是一个实现无参数__next__方法并返回序列中下一个元素的对象;如果没有剩余元素,则抛出StopIteration异常。Python中的迭代器也实现了__iter__方法,所以迭代器也是可迭代的。最后通过对比可以发现,可迭代对象的__iter__返回一个迭代器:def__iter__(self):returnSentenceIterator(self.words)迭代器的__iter__返回self:classSentenceIterator:def__iter__(self):returnsself而iterators也是需要有一个__next__方法。从这一点上,可以清楚地看出它们之间的区别。需要特别注意的是,可迭代对象不能是自己的迭代器,即可迭代对象必须实现了__iter__方法,但不能实现__next__方法。否则,设计模式会变得杂乱无章。参考资料:《流畅的Python》第14章可迭代对象、迭代器和生成器https://www.runoob.com/python3/python3-iterator-generator.html