迭代器和生成器有什么区别?有关何时使用每种情况的一些示例会有所帮助。
iterator是一个更笼统的概念:其类具有next方法(__next__在Python 3中)和具有__iter__方法的任何对象return self。
iterator
__next__
__iter__
return self
每个生成器都是一个迭代器,但反之亦然。生成器是通过调用具有一个或多个yield表达式(yield在Python 2.5及更早版本中为语句)的函数而构建的,并且该函数是满足上一段对的定义的对象iterator。
当你需要一个具有某些复杂的状态维护行为的类时,或者想要暴露除next(和__iter__和__init__)之外的其他方法时,你可能想使用自定义迭代器,而不是生成器。通常,一个生成器(有时,对于足够简单的需求,一个生成器表达式)就足够了,并且它更容易编写代码,因为状态维护(在合理范围内)基本上是由挂起和恢复帧“为你完成的”。
next
__init__
例如,生成器例如:
def squares(start, stop): for i in range(start, stop): yield i * i generator = squares(a, b)
或等效的生成器表达式(genexp)
generator = (i*i for i in range(a, b))
将需要更多代码来构建为自定义迭代器:
class Squares(object): def __init__(self, start, stop): self.start = start self.stop = stop def __iter__(self): return self def next(self): # __next__ in Python 3 if self.start >= self.stop: raise StopIteration current = self.start * self.start self.start += 1 return current iterator = Squares(a, b)
但是,当然,有了类,Squares你可以轻松地提供其他方法,即
def current(self): return self.start
如果你对应用程序中的此类额外功能有实际需求。