Python 迭代器、生成器、可重用性

Python 迭代器、生成器、可重用性,python,python-3.x,python-2.7,iterator,generator,Python,Python 3.x,Python 2.7,Iterator,Generator,我是Python的新手。我能够理解Iterables和Iterators。 然而,我看到有很多东西比较生成器和迭代器 根据理解,Iterable是一个对象,它实际上包含存储在其中的元素(例如列表)。它们遵循迭代协议,在迭代协议中实现\uu iter\uu()方法,该方法返回一个迭代器对象,该对象有助于迭代Iterable 据我所知,生成器有助于动态生成数据,而不是在内存中创建大数据结构并返回数据。我们也可以通过使用迭代器来实现类似的目标 现在我怀疑,如果我们已经有了迭代器,生成器需要什么,因为两

我是Python的新手。我能够理解
Iterables
Iterators
。 然而,我看到有很多东西比较
生成器
迭代器

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

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

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

这些术语是如何在官方Python文档中定义的

iterable

一种能够一次返回一个成员的对象。例子 iterables包括所有序列类型(例如
list
str
,以及
tuple
)和一些非序列类型,如
dict
file
对象和 使用
方法或
实现序列语义的
\uuu getitem\uuu()
方法

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

迭代器

表示数据流的对象。多次致电 迭代器的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu()方法(或将其传递给内置函数
next()
)返回流中的连续项。当没有更多的数据时 可用,将引发异常
StopIteration
。在这 此时,迭代器对象已耗尽,对其
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。迭代器是
需要有一个返回迭代器的
\uuuu iter\uuuu()
方法 对象本身,因此每个迭代器也可用于 在大多数地方,其他的伊特拉布被接受。一个显著的例外 是尝试多次迭代的代码。容器对象 (例如
列表
)每次传递时都会生成一个新的迭代器 调用
iter()
函数,或在for循环中使用它。尝试使用 迭代器将只返回使用的相同迭代器对象 在上一个迭代过程中,使其看起来像一个空的 容器

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

生成器

返回生成器迭代器的函数。看起来是正常的 函数,但它包含用于生成 在<代码>循环中可用或可一次检索的一系列值 每次使用
next()
函数

通常指发电机功能,但也可能指发电机 某些上下文中的迭代器。在预期意义不明确的情况下 清楚,使用完整术语可避免歧义

生成器迭代器

由生成器函数创建的对象

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


生成器是迭代器,它们只是迭代器的简化版本,使用
yield
语法,但功能较少。这篇文章涵盖了您需要知道的一切,可能是一个重复:生成器在技术上是一个迭代器,基本上,它是一种以简洁的方式定义迭代器协议的方法。经典迭代器将使用带有
\uuuuuu iter\uuuuuu
\uuuuuuu next\uuuuuuuuu
方法的类来定义,使用生成器,您可以只使用带有yield语句或生成器表达式的函数来实现这一点。因此,生成器的存在只是为了简化语法,还是有其他原因?我认为在链接的问题中很好地涵盖了所有内容。