小编给大家分享一下Python中可迭代对象,迭代器是什么,希望大家阅读完这篇文章后大所收获、下面让我们一起去探讨吧!
在Python中,有这两个概念容易让人混淆。第一个是可迭代对象(Iterable),第二个是迭代器(迭代器),第三个是生成器(发电机),这里暂且不谈生成器。
<强>可迭代对象强>
列表,元组,字符串,字典等都是可迭代对象,可以使用的循环遍历出所有元素的都可以称为可迭代对象(Iterable)。在Python的内置数据结构中定义了Iterable这个类,在集合。abc模块中,我们可以用这个来检测是否为可迭代对象。
在祝辞祝辞,得到collections import Iterable 在祝辞祝辞,a =, (1、2、3) 祝辞祝辞祝辞,isinstance (a, Iterable) 在祝辞祝辞,真的 祝辞祝辞祝辞,b =, & # 39; abcd # 39; 在祝辞祝辞,isinstance (b, Iterable) 祝辞祝辞祝辞,真正的
这些数据结构之所以能称之为Iterable,是因为其内部实现了__iter__()方法,从而可迭代。当我们使用的循环时,解释器会调用内置的iter()函数,调用前首先会检查对象是否实现了__iter__()方法,如果有就调用它获取一个迭代器(接下来会讲)。加入没有__iter__()方法,但是实现了__getitem__()方法,解释器会创建一个迭代器并且按顺序获取元素。如果这两个方法都没有找的到,就会抛出TypeError异常。下面我们自定义对象,分别实现这两个方法(getitem (), iter ())
class MyObj: ,,,def __init__(自我,,iterable): ,,,,,,,self._iterable =,列表(iterable) ,,,def __getitem__(自我,,项): ,,,,,,,return self._iterable(项) 时间=obj MyObj ([1, 2, 3]) for 小姐:obj拷贝: ,,,印刷(i)
如上所示,这里没有实现__iter__方法,只实现了__getitem__方法,也使得Myobj称为可迭代对象。
下面我们实现__iter__方法,这里使用了收益率语法用来产出值(这里需要生成器的知识)
class Myobj: ,,,def __init__(自我,,iterable): ,,,,,,,self._iterable =,列表(iterable) ,,,def __iter__(自我): ,,,,,,,index =0 ,,,,,,,while 正确的: ,,,,,,,,,,,试一试: ,,,,,,,,,,,,,,,油品收率self._iterable(指数) ,,,,,,,,,,,except IndexError: ,,,,,,,,,,,,,,,休息 ,,,,,,,,,,,index +=1 时间=obj MyObj ([1, 2, 3]) for 小姐:obj拷贝: ,,,印刷(i)
这里同样让对象称为可迭代对象。
<强>迭代器强>
迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
如上图所示,迭代器(Iterator)继承可迭代(Iterable),迭代器必须实现__iter__方法和__next__方法。其中__next__方法用于产出下一个元素。
由继承图可见,迭代器一定是可迭代对象,可迭代对象不一定是迭代器。
迭代器有两个基本的方法:iter()和()。
我们使用iter (Iterable)即可把可迭代对象转换成迭代器。
使用下(迭代器)来获取迭代器的下一个值。
在祝辞祝辞,a =, (3、4、5) ,在的在的在一个 在祝辞祝辞,[3,,4,,5] 在祝辞祝辞,iter (a) 在祝辞祝辞,& lt; list_iterator object at 0 x10b130ba8> 在祝辞祝辞,iterator =, iter (a) 在祝辞祝辞,下一个(迭代器) 在祝辞祝辞,3 在祝辞祝辞,下一个(迭代器) 在祝辞祝辞,4 在祝辞祝辞,下一个(迭代器) 在祝辞祝辞,5 在祝辞祝辞,下一个(迭代器) Traceback (most recent call 最后一个): File 才能“& lt; input>“, line 1,拷贝& lt; module> 抛出StopIteration
如上所示,因为对象实现了__next__方法,我们可以通过下一个(迭代器)来获取迭代器的下一个值,直到没有值了,抛出抛出StopIteration异常结束。
<强>迭代器的背后强>
迭代器迭代器是一个抽象基类,它定义在_collections_abc。py中
迭代器源码如下
class 迭代器(Iterable): ,,,__slots__ =, () ,,@abstractmethod ,,,def __next__(自我): ,,,,,,,& # 39;Return 从而next item 得到,迭代器只When 筋疲力尽,,raise 抛出stopiteration # 39; ,,,,,,,raise 抛出StopIteration ,,,def __iter__(自我): ,,,,,,,return 自我 ,,@classmethod ,,,def __subclasshook__ (cls, C): ,,,,,,,if cls is 迭代器: ,,,,,,,,,,,return _check_methods (C, & # 39; __iter__& # 39;,, & # 39; __next__& # 39;) null null null null null null null null null null null null null null null null null null nullPython中可迭代对象,迭代器是什么