【问题标题】:Python3 Iterators vs generatorsPython3 迭代器与生成器
【发布时间】:2017-04-06 22:06:22
【问题描述】:

我在下面有一个程序,我试图理解迭代器和生成器之间的区别。我知道生成器是迭代器和more。 我很欣赏生成器是生成迭代器的简短而简洁的方式。 但是除了简洁之外,生成器还提供了一些迭代器没有的其他功能

def squares(start, stop):
    for i in range(start, stop):
        yield i * i

generator = squares(1, 10)

print(list(generator))


class Squares(object):
    def __init__(self, start, stop):
        self.start = start
        self.stop = stop

    def __iter__(self):
        return self

    def __next__(self):
        if self.start >= self.stop:
            raise StopIteration
        current = self.start * self.start
        self.start += 1
        return current


iterator = Squares(1, 10)

l = [next(iterator) for _ in range(1,10)]
print(l)

【问题讨论】:

标签: python python-3.x


【解决方案1】:

您发布的两个示例是等效的。

生成器相对于迭代器(不是生成器)的主要优势是生成器使用的内存更少,速度更快,并且可以用于无限流。

当您使用迭代器时,将计算最终要返回的所有项目,然后返回第一个元素。

使用生成器,在计算第二项之前返回第一个元素。

【讨论】:

  • 您的意思是print(list(generator)) 与使用iterator 的列表理解相比一次生成一个项目?
  • 他们都一次计算一个。他们返回每个对象时的差异。想象一下,我有一个非常大的 (TB) 文件,我想做一些事情。如果我有一个生成器,可以将第一行读入内存,然后让我操作它。然后它将读取第二行。因此,即使文件可能很大,甚至是无限的,生成器在内存中也不需要超过一行。另一方面,迭代器会将第一行读入内存,然后是第二行,依此类推。它会在返回第一行之前尝试将整个文件读入内存。
  • 感谢您的解释。您能否给我举一个例子来突出迭代器和生成器(即处理大文件)之间的这种差异
猜你喜欢
  • 2018-05-24
  • 2018-05-16
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
  • 2017-09-03
  • 2016-03-13
  • 1970-01-01
  • 2018-11-01
相关资源
最近更新 更多