iterator
是一个更一般的概念:任何其类具有__next__
方法 (next
在Python 2)和__iter__
的方法return self
.
每个生成器都是一个迭代器,但反之则不然。生成器是通过调用具有一个或多个yield
表达式(yield
语句(在 Python 2.5 及更早版本中),并且是一个满足上一段定义的对象iterator
.
当您需要一个具有某种复杂的状态维护行为的类,或者想要公开除此之外的其他方法时,您可能想要使用自定义迭代器,而不是生成器__next__
(and __iter__
and __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 2
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
如果您的应用程序中确实需要此类额外功能。