2012-10-07 41 views
0

可能重复:
Difference between Python Generators vs Iterators与迭代器相比,生成器的好处是什么?

发电机看起来大不了在Python中,新的功能现在,然后等添加到他们。

据我所见,代替发电机,你总是可以使用带有迭代器接口的对象。 (通常)更简洁是发电机的唯一好处还是我错过了什么?

+0

你能否详细说明一个具有迭代器接口的对象如何与生成器不同? –

+3

@Vaughn,谢谢,请参阅http://stackoverflow.com/questions/2776829/difference-between-python-generators-vs-iterators –

+0

。我没有意识到缺少语法糖,并且暴露了除next()之外的方法的自定义迭代器*,它们不同于生成器:) –

回答

8

是的,迭代器是一个更一般的结构,任何你可以用一个生成器做的事情都可以用迭代器完成。

但是,生成器是非常好的工具,以非常简洁的方式表达某些想法,迭代器会变得繁琐。

例如,这里有一个简单的函数:

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的哲学是基于可读性和简单性的。为了保持这一点,我觉得发生器为广泛的任务提供了一个更好的界面,否则这些任务会需要迭代器。是的,迭代器更强大,但发生器的语法优势当然不容忽视。

+0

谢谢!我同意第一个版本在视觉和语义上看起来更清晰,但是权衡是你需要引入/学习一种新的语言结构。我只是担心,也许我忽略了别的东西。 – Aivar

-1

迭代器和生成器之间的区别在于,生成器进行延迟评估,它根据需要生成值,迭代器在每次迭代中计算值并将它们存储在内存中。 发电机组对于巨大的回路比较好,因为它们在此时仅“保持”一个值。

+1

为什么interator必须在开始时创建值?它可以在“下一个”方法中生成每个新值 – Aivar

+0

@razi:对不起,这不是迭代器在Python中的工作方式。迭代器可以和发生器一样懒。 – nneonneo

+0

你能给我一个懒惰的迭代器的例子吗? 我诚实地认为/认为只有发电机可以这样工作,即时生成价值,而其他人则将其存储在内存中。 – razi