迭代器与生成器与Iterables

时间:2017-12-11 06:07:10

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

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

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

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

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

1 个答案:

答案 0 :(得分:5)

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

<强>迭代

  

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

     

Iterables可用于for循环和许多其他地方   需要序列(zip()map(),...)。当可迭代对象是   作为参数传递给内置函数iter(),它返回一个   对象的迭代器。这个迭代器很适合一次通过   一组价值观。使用iterables时,通常没有必要   调用iter()或自己处理迭代器对象。 for   声明会自动为您创建,创建一个临时的   用于在循环期间保存迭代器的未命名变量。   另请参见迭代器,序列和生成器。

<强>迭代

  

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

     

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

<强>发生器

  

返回生成器迭代器的函数。看起来很正常   函数除了包含yield表达式以生成a   可以在for循环中使用的一系列值,也可以是一个可以检索的值   一次使用next()功能。

     

通常指发电机功能,但可以指发电机   迭代器在某些情况下。在预期含义不是的情况下   明确,使用完整的术语可以避免含糊不清。

生成器迭代器

  

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

     

每个yield暂时暂停处理,记住位置   执行状态(包括局部变量和待定   try - 语句)。当发生器迭代器恢复时,它就会恢复   它停止的地方(与每一个都重新开始的功能形成鲜明对比)   调用)。