Python迭代器与可迭代与生成器

示例

一个迭代是一个对象,可以返回一个迭代器。具有状态且具有__iter__  方法并返回迭代器的任何对象都是可迭代的。也可能是没有状态的对象,该对象实现了__getitem__方法。-该方法可以获取索引(从零开始),并IndexError在索引不再有效时引发。

Python的str类是__getitem__可迭代的示例。

一个迭代是当你调用产生序列中的下一个值的对象,next(*object*)一些对象。而且,任何带有__next__方法的对象都是迭代器。迭代StopIteration器用完之后会引发迭代器,并且此时不能重复使用。

迭代类:

可迭代的类定义__iter__和__next__方法。可迭代类的示例:

class MyIterable:

    def __iter__(self):

         return self

    def __next__(self):
         #code

#旧版python中的经典可迭代对象__getitem__仍受支持...
class MySequence:

    def __getitem__(self, index):

         if (condition):
             raise IndexError
         return (item)

 #可以通过使用iter(MySequence())产生一个普通的`iterator`实例

尝试实例化collections模块中的抽象类以更好地了解这一点。

例:

Python 2.x 2.3
import collections
>>> collections.Iterator()
>>> TypeError: Cant instantiate abstract class Iterator with abstract methods next
Python 3.x 3.0
>>> TypeError: Cant instantiate abstract class Iterator with abstract methods __next__

通过执行以下操作来处理Python 2对Python 2中可迭代类的兼容性:

Python 2.x 2.3
class MyIterable(object): #或collections.Iterator,我建议...。

     ....

     def __iter__(self): 

          return self

     def next(self): #code

     __next__ = next

这两个现在都是迭代器,可以循环通过:

ex1 = MyIterableClass()
ex2 = MySequence()

for (item) in (ex1): #code
for (item) in (ex2): #code

生成器是创建迭代的简单方法。生成器迭代器,迭代器是可迭代的。