擅长:python、mysql、java
<p>在一般情况下,预览或回放生成器是不可能的。这是因为生成器可能有副作用,你要么比预期的更早(预览时),要么多次(倒带前后)。例如,考虑以下生成器:</p>
<pre><code>def foo_gen():
print("start")
yield 1
print("middle")
yield 2
print("end")
</code></pre>
<p>如果您可以预览此生成器生成的结果(<code>1</code>和<code>2</code>),您希望得到打印输出吗?在</p>
<p>也就是说,可能有一些方法可以让代码更容易处理。在</p>
<p>考虑使用列表理解而不是生成器表达式。这在大多数情况下都很简单,只需在已有的genexp后面加上方括号。在许多将生成器传递给其他代码的情况下,任何iterable对象(例如<code>list</code>)都可以正常工作。在</p>
<p>类似地,如果从其他地方将生成器传递到代码中,通常可以将生成器传递给<code>list</code>,并在以后的代码中使用该列表。这当然不是非常节省内存,因为您需要预先消耗整个生成器,但是如果您想在交互式控制台中查看值,那么这可能是必需的。在</p>
<p>还可以使用<a href="https://docs.python.org/3/library/itertools.html#itertools.tee" rel="nofollow">^{<cd5>}</a>获取两个(或更多)迭代器,这些迭代器将生成与传入的iterable相同的值。这将允许您检查其中一个的值,同时传递另一个。请注意,<code>tee</code>代码将需要存储任何迭代器生成的所有值,直到所有其他迭代器也生成它为止(因此,如果您在其他迭代器之前运行了一个迭代器,那么您最终使用的内存可能与使用<code>list</code>相同或更多)。在</p>