2016-05-23 52 views

回答

3

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

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

准确定义见Python glossaryiterator,iterablegenerator

例如,发生器条目包括:

其返回迭代的函数。

这是很常见的使用生成函数来实现迭代器的迭代,通过实施object.__iter__

class SomeContainer(object): 
    def __iter__(self): 
     for elem in self._datastructure: 
      if elem.visible: 
       yield elem.value 

所以SomeContainer实例是迭代(就像名单),iter(iterable)产生一个迭代器,其中恰好是一个发生器对象

+0

会发电机对象也是一个迭代的话,因为它有一个'__iter__'功能,并产生一个迭代还是我犯了这个错误 – Xiphias

+0

@Xiphias:??每一个迭代器是迭代的,是的 –

2

列表不是迭代器。列表是可疑错误,当你调用iter(somelist)它会产生一个迭代器。什么样的迭代器产生取决于所讨论的Iterable,列表中的一个是相当充分的名称列表。

任何生成器都是迭代器。
任何迭代器是一个可迭代(尝试iter(iter(somelist))
没有任何可迭代(列表,例如)是一个迭代器,但是当你调用iter(someiterable)someiterable.__iter__()可迭代返回一个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 
+0

我明白了,没有任何iterable是迭代器,因为生成器是可迭代的,但不是迭代器? – Xiphias

+1

@Xiphias不完全。生成器是一种特殊的迭代器,所以任何生成器都是迭代器。没有任何Iterable是一个迭代器,因为Iterables和迭代器是两回事。 Iterables能够生成迭代器。迭代器是具有'__iter__'和'__next__'方法的对象。所有迭代器都是Iterables,因为它们可以生成迭代器(按照惯例,当在Iterator上调用iter时,它们会自己返回)。 – timgeb