Python中非生成器的正确术语是什么?
迭代器是顶级类别,生成器是一种特殊的迭代器 对于像是迭代器而不是生成器的常用列表这样的东西,什么是正确的术语?列表是可编辑的。您可以通过调用Python中非生成器的正确术语是什么?,python,iterator,Python,Iterator,迭代器是顶级类别,生成器是一种特殊的迭代器 对于像是迭代器而不是生成器的常用列表这样的东西,什么是正确的术语?列表是可编辑的。您可以通过调用iter(iterable)为它们生成迭代器 没有包含迭代器和排除生成器的特殊术语 有关精确定义,请参见和 例如,生成器条目包括: 返回迭代器的函数 使用生成器函数实现iterable的迭代器非常常见,方法是实现: 因此,SomeContainer实例是iterable(就像列表一样),iter(iterable)生成一个迭代器,它恰好是一个生成器对象。列表
iter(iterable)
为它们生成迭代器
没有包含迭代器和排除生成器的特殊术语
有关精确定义,请参见和
例如,生成器条目包括:
返回迭代器的函数
使用生成器函数实现iterable的迭代器非常常见,方法是实现:
因此,
SomeContainer
实例是iterable(就像列表一样),iter(iterable)
生成一个迭代器,它恰好是一个生成器对象。列表不是迭代器。列表是可重用的,当您调用iter(somelist)
时,它会生成一个迭代器。生成什么样的迭代器取决于所讨论的Iterable,列表中的Iterable被恰当地命名为listiterator
任何生成器都是迭代器。任何迭代器都是iter(尝试
iter(iter(somelist))
不是任何Iterable(例如列表)都是迭代器,但是当您调用
iter(someiterable)
或someiterable时,任何Iterable都会返回迭代器
编辑:下面是一个简短的(Python 3)示例:
导入集合
>>>随机输入
>>>
>>>类MyIterable:
…定义(自我):
…返回MyIterator()
>>>
>>>类MyIterator:
…定义下一个(自我):
…返回random.randint(-10,10)
…定义(自我):
…回归自我
...
>>>mable=MyIterable()
>>>mitor=国际热核试验堆(mable)
>>>iInstance(mable、collections.Iterable)
真的
>>>iInstance(mable、collections.Iterator)
假的
>>>iInstance(mitor,collections.Iterable)
真的
>>>isinstance(mitor、collections.Iterator)
真的
>>>下一个(米托)
-7
>>>下一个(米托)
-3
>>>下一个(米托)
-3
>>>下一个(米托)
7.
>>>下一个(梅布尔)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:“MyIterable”对象不是迭代器
那么生成器对象也会是iterable吗,因为它有一个\uuuuu iter\uuuu
函数并产生一个iterable?还是我弄错了?@Xiphias:每个迭代器都是iterable的,是的。我明白了。没有任何iterable是迭代器,因为生成器是iterable的,但不是迭代器?@Xiphias不完全是。生成器是一种特殊的迭代器,so任何生成器都是迭代器。不是任何Iterable都是迭代器,因为Iterable和迭代器是两个不同的东西。Iterable能够生成迭代器。迭代器是具有\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
和方法的对象。所有迭代器都是Iterable,因为它们可以生成迭代器(按照惯例,在迭代器上调用iter
时,它们只返回自身)。
class SomeContainer(object):
def __iter__(self):
for elem in self._datastructure:
if elem.visible:
yield elem.value
>>> import collections
>>> import random
>>>
>>> class MyIterable:
... def __iter__(self):
... return MyIterator()
>>>
>>> class MyIterator:
... def __next__(self):
... return random.randint(-10, 10)
... def __iter__(self):
... return self
...
>>> mable = MyIterable()
>>> mitor = iter(mable)
>>> isinstance(mable, collections.Iterable)
True
>>> isinstance(mable, collections.Iterator)
False
>>> isinstance(mitor, collections.Iterable)
True
>>> isinstance(mitor, collections.Iterator)
True
>>> next(mitor)
-7
>>> next(mitor)
-3
>>> next(mitor)
-3
>>> next(mitor)
7
>>> next(mable)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'MyIterable' object is not an iterator