擅长:python、mysql、java
<p><code>To me it seems like since RZ instantly calls the method returned by interleave which in turn calls b which is RZ (before the first call to yield),</code>调用包含<code>yield</code>的函数将返回一个迭代器对象,直到开始迭代时才会对其求值,因为这样的RZ也返回迭代器,因为它调用的result具有yield,因此它最初返回一个迭代器,即RZ返回迭代器。在</p>
<p><code>yield next(x)</code>将调用<code>yield i</code>并停止,再次调用迭代器<code>yield next(y)</code>将调用<code>x = a(); y = b(); while True: yield next(x)</code>并停止,依此类推,它似乎在不断地创建生成器,虽然不是很快,但这可能是好的,也可能不是很好。。。在</p>
<pre><code>count = 0
def N():
i=1
global count
count += 1
while True:
yield i
i+=1
def interleave(a,b):
def result():
global count
count += 1
x=a()
y=b()
while True:
yield next(x)
yield next(y)
return result
def RZ():
return interleave(N,RZ)()
gen = RZ() # 1) call RZ
gen = RZ()
r = [next(gen) for index in xrange(100)]
print count
</code></pre>
<p>它生成了14个迭代器对象,经过100次迭代,1000次后20次,10000次后28次,100000次后34次,速度相当慢。。。在</p>