<p>上面的答案很好,但正如我所看到的,对于像我这样的人来说,不要过分强调区分。</p>
<p>此外,人们倾向于把“X是一个之前有<code>__foo__()</code>方法的对象”这样的定义放在前面,从而得到“太Pythonic”。这样的定义是正确的——它们基于duck类型哲学,但是当试图以简单的方式理解这个概念时,对方法的关注往往介于两者之间。</p>
<p>所以我添加了我的版本。</p>
<hr/>
<p>在自然语言中</p>
<ul>
<li><strong>迭代是在一行元素中一次获取一个元素的过程。</li>
</ul>
<p>在Python中</p>
<ul>
<li><p><strong>iterable</strong>是一个对象,好吧,iterable,简单地说,就是
它可以在迭代中使用,例如与<code>for</code>循环一起使用。怎样?通过使用<em>迭代器</em>。
我在下面解释。</p></li>
<li><p>。。。而迭代器是一个定义如何实际操作的对象
迭代——特别是<em>下一个</em>元素是什么。所以它一定有
<code>next()</code>方法。</p></li>
</ul>
<p>迭代器本身也是可iterable的,区别在于它们的<code>__iter__()</code>方法返回相同的对象(<code>self</code>),而不管以前对<code>next()</code>的调用是否使用了它的项。</p>
<hr/>
<p>那么,当Python解释器看到<code>for x in obj:</code>语句时,它会怎么想呢?</p>
<blockquote>
<p>Look, a <code>for</code> loop. Looks like a job for an iterator... Let's get one. ...
There's this <code>obj</code> guy, so let's ask him.</p>
<p>"Mr. <code>obj</code>, do you have your iterator?" (... calls <code>iter(obj)</code>, which calls
<code>obj.__iter__()</code>, which happily hands out a shiny new iterator <code>_i</code>.) </p>
<p>OK, that was easy... Let's start iterating then. (<code>x = _i.next()</code> ... <code>x = _i.next()</code>...)</p>
</blockquote>
<p>由于<code>obj</code>先生成功地完成了这个测试(通过使用返回有效迭代器的特定方法),我们用形容词奖励他:您现在可以称他为“iterable先生<code>obj</code>”。</p>
<p>然而,在简单的情况下,您通常不会从分别使用iterator和iterable中获益。所以您只定义了一个<em>对象,它也是它自己的迭代器。(Python并不真的在乎由<code>obj</code>发出的<code>_i</code>不是那么闪亮,而是<code>obj</code>本身。)</p>
<p>这就是为什么在我所见过的大多数例子中(以及那些让我一次又一次困惑的例子),
你可以看到:</p>
<pre><code>class IterableExample(object):
def __iter__(self):
return self
def next(self):
pass
</code></pre>
<p>而不是</p>
<pre><code>class Iterator(object):
def next(self):
pass
class Iterable(object):
def __iter__(self):
return Iterator()
</code></pre>
<p>不过,有些情况下,当迭代器与iterable分离时,您可以从中受益,例如当您希望有一行项,但有更多的“游标”时。例如,当您想使用“current”和“coming”元素时,可以为这两个元素分别使用迭代器。或者从一个巨大的列表中提取多个线程:每个线程都可以有自己的迭代器来遍历所有项。请参阅上面的<a href="https://stackoverflow.com/a/9884501/835945">@Raymond's</a>和<a href="https://stackoverflow.com/a/9884245/835945">@glglgl's</a>答案。</p>
<p>想象一下你能做什么:</p>
<pre><code>class SmartIterableExample(object):
def create_iterator(self):
# An amazingly powerful yet simple way to create arbitrary
# iterator, utilizing object state (or not, if you are fan
# of functional), magic and nuclear waste--no kittens hurt.
pass # don't forget to add the next() method
def __iter__(self):
return self.create_iterator()
</code></pre>
<p>注:</p>
<ul>
<li><p>我再重复一遍:<em>迭代器不可迭代。迭代器不能用作
<code>for</code>循环中的“源”。<code>for</code>循环主要需要的是<code>__iter__()</code>
(返回带有<code>next()</code>的内容)。</p></li>
<li><p>当然,<code>for</code>不是唯一的迭代循环,所以上面的方法适用于其他一些循环
构造(<code>while</code>…)。</p></li>
<li><p>迭代器的<code>next()</code>可以抛出StopIteration来停止迭代。不必,
不过,它可以永远迭代或使用其他方法。</p></li>
<li><p>在上述“思维过程”中,<code>_i</code>并不真正存在。这个名字是我编的。</p></li>
<li><p>Python 3.x:<code>next()</code>方法(不是内置的)现在有了一个小小的变化
必须调用<code>__next__()</code>。是的,应该一直都是这样的。</p></li>
<li><p>你也可以这样想:iterable有数据,迭代器拉下一个
项目</p></li>
</ul>
<p><em>免责声明:</em>我不是任何Python解释器的开发人员,所以我不知道解释器的“想法”。上面的思考仅仅是展示了我是如何从一个Python新手的其他解释、实验和真实体验中理解这个主题的。</p>