可能重复:
Difference between Python Generators vs Iterators与迭代器相比,生成器的好处是什么?
发电机看起来大不了在Python中,新的功能现在,然后等添加到他们。
据我所见,代替发电机,你总是可以使用带有迭代器接口的对象。 (通常)更简洁是发电机的唯一好处还是我错过了什么?
可能重复:
Difference between Python Generators vs Iterators与迭代器相比,生成器的好处是什么?
发电机看起来大不了在Python中,新的功能现在,然后等添加到他们。
据我所见,代替发电机,你总是可以使用带有迭代器接口的对象。 (通常)更简洁是发电机的唯一好处还是我错过了什么?
是的,迭代器是一个更一般的结构,任何你可以用一个生成器做的事情都可以用迭代器完成。
但是,生成器是非常好的工具,以非常简洁的方式表达某些想法,迭代器会变得繁琐。
例如,这里有一个简单的函数:
def count_to(m):
n = 0
while n <= m:
yield n
n += 1
尼斯和容易。以下是同样的事情一个迭代:
class CountTo:
def __init__(self, m):
self.m = m
self.n = 0
def __iter__(self):
return self
def next(self):
if self.n <= self.m:
cur, self.n = self.n, self.n + 1
return cur
else:
raise StopIteration()
一个是5行,另一种是12的发电机表示迭代过程非常succintly,而迭代器与显式地维护状态和样板代码混淆它。
很多Python的哲学是基于可读性和简单性的。为了保持这一点,我觉得发生器为广泛的任务提供了一个更好的界面,否则这些任务会需要迭代器。是的,迭代器更强大,但发生器的语法优势当然不容忽视。
谢谢!我同意第一个版本在视觉和语义上看起来更清晰,但是权衡是你需要引入/学习一种新的语言结构。我只是担心,也许我忽略了别的东西。 – Aivar
你能否详细说明一个具有迭代器接口的对象如何与生成器不同? –
@Vaughn,谢谢,请参阅http://stackoverflow.com/questions/2776829/difference-between-python-generators-vs-iterators –
。我没有意识到缺少语法糖,并且暴露了除next()之外的方法的自定义迭代器*,它们不同于生成器:) –