<p>迭代器协议由两部分组成。<code>__iter__</code>方法是最重要的方法,当您在一个对象上使用<code>iter()</code>时,它应该返回迭代器。在</p>
<p>只需将<code>__iter__</code>的主体替换为<code>myGenerator</code>;无需提升<code>StopIteration</code>:</p>
<pre><code>class myIterator:
def __init__(self, n):
self.last = n
def __iter__(self):
prev = 0
fib = 1
while fib < self.last:
res = fib
yield res
fib += prev
prev = res
</code></pre>
<p>现在<code>iter(myIterator(10))</code>是一个迭代器,有一个<code>.next()</code>方法。在</p>
<p>如果您希望您的类直接用作迭代器,则需要<code>__iter__</code>来返回<code>self</code>,并提供一个<code>.next()</code>方法。在</p>
<p>一个<code>.next()</code>方法为每个函数体生成一个<em>元素(并使用<code>return somevalue</code>)。生成器只是一个使用<code>yield</code>的函数,实际上,这样的方法本身为您实现了迭代器协议(包括<code>.next()</code>)。在</p>
<p>如果要使用<code>.next()</code>,它看起来应该是这样的:</p>
^{pr2}$
<p><em>或</em>您可以重用生成器的<code>.next()</code>方法:</p>
<pre><code>class myIterator:
def __init__(self, n):
self.last = n
self.next = self.myGenerator().next # Use the generator `.next`
def __iter__(self):
return self
def myGenerator(self):
prev = 0
fib = 1
while fib < self.last:
res = fib
yield res
fib += prev
prev = res
</code></pre>