<p>结合评论中的建议,您可以获得您想要的确切行为。我不会详细讨论发电机是如何工作的,因为您从有经验的人那里得到了更简洁的答案。我将</strong>总结一下,生成器的要点是它们<code>yield</code>为您提供下一个<em>元素<strong>,只有在您要求时才提供它。生成器和Python中的其他对象一样,都是对象,因此只要您<em>共享</em>同一个生成器对象,您将始终拥有最后一个元素<code>yield</code>的<em>书签</em>。现在要更好地理解代码:</p>
<p>首先,我们将泛化<code>looper</code>函数:</p>
<pre class="lang-py prettyprint-override"><code>def looper(iterable, runs):
i = cycle(iterable)
for _ in range(runs):
print(next(i))
return i
</code></pre>
<p>因此,现在它允许您在任何iterable上调用一次函数,调用的<code>runs</code>数量与您想要的数量相同。另一方面,如果要多次调用它,它将返回为重用而创建的生成器</p>
<p>现在让我们测试一些案例:</p>
<pre class="lang-py prettyprint-override"><code>a = [1, 2, 3]
looper(a, 6)
</code></pre>
<p>这将打印:</p>
<pre class="lang-none prettyprint-override"><code>1
2
3
1
2
3
</code></pre>
<p>但更重要的是,这也将:</p>
<pre class="lang-py prettyprint-override"><code>i = looper(a, 2)
looper(i, 2)
looper(i, 2)
</code></pre>
<hr/>
<p><strong>注意事项:</strong></p>
<ul>
<li><p>我们之所以能够做到这一切,是因为<a href="https://docs.python.org/3.8/library/itertools.html#itertools.cycle" rel="nofollow noreferrer">^{<cd5>}</a>正在返回一个生成器对象</p>
</li>
<li><p>如果希望在调用之间产生循环效果,则必须将返回的生成器传递给后续调用。例如,如果我们尝试几次<code>looper(a, 2)</code>,我们总会得到:</p>
<pre><code> 1
2
</code></pre>
<p>这是因为每次调用函数时,我们都会再次调用<code>cycle</code>,并从从第一个元素开始的原始列表创建一个新的生成器</p>
</li>
<li><p>另一方面,当将生成器传递给函数时,<code>cycle</code>函数将创建一个新的生成器,但从该点开始,前一个生成器停止。这样,如果您继续传递第一个返回的<code>cycle</code>生成器,则可以保留循环效果</p>
</li>
</ul>