我是Python
的新手。我能够理解Iterables
和Iterators
。
但是我看到有很多内容可以比较Generators
与Iterators
。
根据理解,Iterable
是一个实际上存储有元素的对象(例如,列表)。它们遵循迭代协议,在其中实现__iter__()
方法,该方法返回Iterator
对象,有助于迭代Iterable
。
根据我的理解Generators
有助于动态生成数据,而不是在内存中创建大数据结构并返回它。我们也可以通过Iterators
来实现同步目标。
现在我怀疑,如果我们已经Iterators
需要Generators
,那么两者都有助于实现类似的即时生成数据的目标。
这仅仅是为了简化语法还是存在Generators
存在的任何其他原因?
答案 0 :(得分:5)
以下是官方Python文档中glossary中定义这些术语的方法。
<强>迭代强>
一个能够一次返回一个成员的对象。示例 iterables包括所有序列类型(例如
list
,str
和tuple
}和一些非序列类型,如dict
,file
个对象,以及 使用__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
- 语句)。当发生器迭代器恢复时,它就会恢复 它停止的地方(与每一个都重新开始的功能形成鲜明对比) 调用)。