Python中非生成器的正确术语是什么?

时间:2016-05-23 11:20:15

标签: python iterator

迭代器是顶级类别,生成器是一种特殊的迭代器。

像通常的列表那样是迭代器而不是生成器的正确术语是什么?

2 个答案:

答案 0 :(得分:3)

列表是 iterables 。您可以通过调用iter(iterable)为它们生成迭代器。

没有包含迭代器和排除生成器的特殊术语。

有关Python glossaryiteratoriterable的精确定义,请参阅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