迭代器是顶级类别,生成器是一种特殊的迭代器。
像通常的列表那样是迭代器而不是生成器的正确术语是什么?
答案 0 :(得分:3)
列表是 iterables 。您可以通过调用iter(iterable)
为它们生成迭代器。
没有包含迭代器和排除生成器的特殊术语。
有关Python glossary,iterator和iterable的精确定义,请参阅generator。
例如, generator 条目包括:
返回迭代器的函数。
通过实现object.__iter__
,使用生成器函数来实现迭代的迭代器是很常见的:
class SomeContainer(object):
def __iter__(self):
for elem in self._datastructure:
if elem.visible:
yield elem.value
所以SomeContainer
实例可迭代(就像列表一样),iter(iterable)
生成迭代器,恰好是生成器对象。
答案 1 :(得分:2)
列表不是迭代器。列表是 Iterables ,当您调用iter(somelist)
时,它会生成一个Iterator。生成什么样的迭代器取决于所讨论的Iterable,列表中的Iterator充分命名为listiterator。
任何发电机都是迭代器
任何Iterator都是Iterable(尝试iter(iter(somelist))
。)
没有任何Iterable(例如列表)是Iterator,但是当您致电iter(someiterable)
或someiterable.__iter__()
时,任何Iterable都会返回Iterator。
编辑:这是一个简短的(Python 3)示例:
>>> 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