【问题标题】:Iterators vs Generators vs Iterables [duplicate]迭代器与生成器与迭代器 [重复]
【发布时间】:2018-05-24 15:27:13
【问题描述】:

我是Python 的新手。我能够理解IterablesIterators。 但是我看到有很多东西可以比较 GeneratorsIterators

据了解,Iterable 是一个对象,其中实际上存储了元素(例如列表)。他们遵循一个迭代协议,在该协议中他们实现了__iter__() 方法,该方法返回一个Iterator 对象,该对象有助于迭代Iterable

据我了解,Generators 有助于动态生成数据,而不是在内存中创建大数据结构并返回它。我们也可以通过使用Iterators 来实现类似的目标。

现在我怀疑,如果我们已经拥有Iterators,那么Generators 的需要是什么,因为两者都有助于实现动态生成数据的类似目标。 这只是为了简化语法还是有任何其他原因导致Generators 存在?

【问题讨论】:

  • 生成器是迭代器,它们只是使用yield 语法的迭代器的简化版本,但它们的功能较少。这篇文章涵盖了您需要知道的所有内容,可能是骗子:stackoverflow.com/q/2776829/6622817
  • 从技术上讲,生成器是一个迭代器,基本上,它是一种以紧凑的方式定义迭代器协议的方法。经典迭代器将使用具有 __iter____next__ 方法的类来定义,使用生成器,您只需使用带有 yield 语句或生成器表达式的函数即可完成此操作。
  • 所以生成器的存在只是为了简化语法还是有其他原因?
  • 我认为链接问题中的Aaron Hall♦'s answer 很好地涵盖了所有内容。

标签: python python-3.x python-2.7 iterator generator


【解决方案1】:

以下是 Python 官方文档中 glossary 中这些术语的定义方式。

可迭代

一个能够一次返回其成员的对象。示例 可迭代对象包括所有序列类型(例如liststrtuple) 和一些非序列类型,如 dictfile 对象和 您使用 __iter__() 方法或使用定义的任何类的对象 实现序列语义的__getitem__() 方法。

Iterables 可以用在 for 循环和许多其他地方 需要序列(zip()map(),...)。当一个可迭代对象是 作为参数传递给内置函数iter(),它返回一个 对象的迭代器。此迭代器适用于一次通过 一组值。使用可迭代对象时,通常不需要 调用iter() 或自己处理迭代器对象。 for 语句会自动为您执行此操作,创建一个临时的 在循环期间保存迭代器的未命名变量。 另请参阅迭代器、序列和生成器。

迭代器

表示数据流的对象。反复调用 迭代器的__next__() 方法(或将其传递给内置函数 next()) 返回流中的连续项目。当没有更多数据时 可用 StopIteration 引发异常。在这 点,迭代器对象已用尽,任何进一步调用它的 __next__() 方法只需再次提高 StopIteration。迭代器是 需要有一个返回迭代器的__iter__() 方法 对象本身,因此每个迭代器也是可迭代的,并且可以用于 大多数接受其他迭代的地方。一个值得注意的例外 是尝试多次迭代的代码。容器对象 (例如list)每次传递时都会生成一个新的迭代器 到 iter() 函数或在 for 循环中使用它。尝试这个 迭代器将只返回使用的相同耗尽的迭代器对象 在之前的迭代过程中,使它看起来像一个空的 容器。

更多信息可以在迭代器类型中找到。

发电机

返回生成器迭代器的函数。看起来很正常 函数,除了它包含 yield 表达式用于生成 可在for-loop 中使用或可以检索到的一系列值 一次使用next() 函数。

通常指代生成器函数,但也可能指代生成器 某些情况下的迭代器。在不符合预期含义的情况下 清楚,使用完整的术语可以避免歧义。

生成器迭代器

由生成器函数创建的对象。

每个yield 暂时暂停处理,记住位置 执行状态(包括局部变量和挂起 try-语句)。当生成器迭代器恢复时,它会拾取 它停止的地方(与每次都重新开始的功能相反 调用)。

【讨论】:

    猜你喜欢
    • 2017-04-06
    • 2012-03-23
    • 2018-04-26
    • 2018-05-16
    • 2010-10-27
    • 2016-10-22
    • 2013-02-15
    • 1970-01-01
    • 2015-11-07
    相关资源
    最近更新 更多