迭代器vs生成器vs可迭代

Sum*_*han 2 python iterator generator python-2.7 python-3.x

我是新手Python。我能够理解IterablesIterators。但是我已经看到有很多东西可以Generators比作Iterators

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

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

现在我很怀疑,如果我们已经有了Iterators的需求Generators,因为两者都有助于实现即时生成数据的相似目标。这仅仅是为了简化语法,还是存在其他原因Generators

PM *_*ing 6

在官方Python文档的词汇表中定义这些术语的方式如下。

可迭代的

一个能够一次返回其成员的对象。iterables的实例包括所有类型的序列(如liststr,和 tuple)和一些非序列类型,如dictfile对象,和对象你与定义任何类的__iter__()方法或用__getitem__()方法实现序列语义。

Iterables可以在其中需要序列可用于循环和很多其他地方(zip()map(),...)。将可迭代对象作为参数传递给内置函数时iter(),它将返回该对象的迭代器。此迭代器非常适合在一组值上传递一次。使用可迭代对象时,通常不必自己调用iter()或处理迭代器对象。该for 语句自动为您执行此操作,并创建一个临时的未命名变量来在迭代过程中保留迭代器。另请参见迭代器,序列和生成器。

迭代器

表示数据流的对象。重复调用迭代器的__next__()方法(或将其传递给内置函数 next())将返回流中的后续项。如果没有更多数据可用,StopIteration则会引发异常。此时,迭代器对象已用尽,对它的__next__()方法的任何进一步调用都 将StopIteration再次引发。迭代器必须具有__iter__()返回迭代器对象本身的方法,因此每个迭代器也是可迭代的,并且可以在接受其他可迭代的大多数地方使用。一个值得注意的例外是尝试多次迭代遍历的代码。list每次将容器对象传递给时,容器对象(例如)都会产生一个新的新迭代器。iter()函数或在for循环中使用它。使用迭代器尝试执行此操作将仅返回上一次迭代过程中使用的相同的耗尽迭代器对象,使其看起来像一个空容器。

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

发电机

返回生成器迭代器的函数。它看起来像一个普通函数,不同之处在于它包含yield用于产生一系列可在for-loop中使用的值或可通过该next()函数一次检索的值的表达式。

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

生成器迭代器

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

每个组件都会yield临时挂起处理,并记住位置执行状态(包括局部变量和挂起的 try语句)。当生成器迭代器恢复时,它将在中断的地方继续(与在每次调用时重新启动的函数相反)。