Python中可迭代对象,迭代器是什么

  介绍

小编给大家分享一下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)

这里同样让对象称为可迭代对象。

<强>迭代器

迭代器是一个可以记住遍历的位置的对象。

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

 Python中可迭代对象,迭代器是什么

如上图所示,迭代器(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   null

Python中可迭代对象,迭代器是什么