擅长:python、mysql、java
<p>正如您所发现的,由生成器表达式创建的对象是一个迭代器(更确切地说是<em>生成器迭代器</em>),设计为只使用一次。如果需要可重置的生成器,只需创建一个实际的生成器并在循环中使用它:</p>
<pre><code>def multiples_of_3(): # generator
for i in range(100):
yield i * 3
def multiples_of_7(): # generator
for i in range(100):
yield i * 7
list((i,j) for i in multiples_of_3() for j in multiples_of_7())
</code></pre>
<p>第二段代码可以工作,因为内部循环(<code>(i*7 ...)</code>)的表达式列表在外循环的每一次传递时都会求值。这会导致每次都创建一个新的生成器迭代器,这将提供所需的行为,但以牺牲代码的清晰度为代价。在</p>
<p>要理解发生了什么,请记住,当<code>for</code>循环遍历迭代器时,不会对它进行“重置”。(这是一个特性;这样的重置会使在大型迭代器上的迭代中断成碎片,并且生成器不可能这样做。)例如:</p>
^{pr2}$
<p>……与此相反:</p>
^{3}$
<p>生成器表达式与调用的生成器等效,因此只能迭代一次。在</p>