<p>您的代码不起作用,因为它在每次调用<code>__next__()</code>时都重新创建生成器函数,这将有效地将它们重置回初始状态,然后返回下一个<code>next()</code>值:</p>
<pre><code> def __next__(self):
g1, g2 = self._gen1(), self._gen2() # Don't do this here.
return next(g1), next(g2)
</code></pre>
<p>您可以通过添加<code>__init__()</code>方法并在其中初始化它们来修复此问题:</p>
<pre><code>class Test:
def __init__(self):
self.g1, self.g2 = self._gen1(), self._gen2() # Initialize here.
def __next__(self):
return next(self.g1), next(self.g2)
...
</code></pre>
<p>一种更雄辩、更简洁的方法是使用内置的<a href="https://docs.python.org/3/library/functions.html#zip" rel="nofollow noreferrer">^{<cd4>} function</a>来创建一个“生成器迭代器”,每次调用它时,它都会从每个生成器返回一对下一个值,从而避免出现问题。另一个优点是,只需更改<code>__init__()</code>方法,就可以很容易地扩展到处理更多的生成器。你知道吗</p>
<p>我的意思是:</p>
<pre><code>class Test:
def __init__(self):
self.generators = zip(self._gen1(), self._gen2())
def __next__(self):
return next(self.generators)
def _gen1(self):
i = 0
while True:
yield i
i += 2
def _gen2(self):
i = 1
while True:
yield i
i += 2
t = Test()
for _ in range(3):
print(next(t))
</code></pre>
<p>输出:</p>
<pre class="lang-none prettyprint-override"><code>(0, 1)
(2, 3)
(4, 5)
</code></pre>