Iterator vs Iterable vs Generator
一个迭代是一个对象,可以返回一个迭代器。具有 __iter__
方法并返回迭代器的状态的任何对象都是可迭代的。它也可以是没有实现 __getitem__
方法的状态的对象。 - 该方法可以采用索引(从零开始)并在索引不再有效时引发 IndexError
。
Python 的 str
类是 __getitem__
可迭代的一个例子。
一个迭代器是产生在一个序列中,当你调用 next(*object*)
一些物体上的下一个值的对象。而且,任何使用 __next__
方法的对象都是迭代器。迭代器在耗尽迭代器后会升高 StopIteration
,此时无法重复使用。
可变类:
可迭代类定义了 __iter__
和 __next__
方法。可迭代类的示例:
class MyIterable:
def __iter__(self):
return self
def __next__(self):
#code
#Classic iterable object in older versions of python, __getitem__ is still supported...
class MySequence:
def __getitem__(self, index):
if (condition):
raise IndexError
return (item)
#Can produce a plain `iterator` instance by using iter(MySequence())
尝试从 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 3 兼容性:
Python 2.x >= 2.3
class MyIterable(object): #or collections.Iterator, which I'd recommend....
....
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
生成器是创建迭代器的简单方法。生成器是迭代器,迭代器是可迭代的。