有人可以解释为什么它只打印3行而不是24行的机制。我知道它是由于生成器功能耗尽,但是如何?
def counter_gen(size):
cur=1
while cur <= size:
yield cur
cur +=1
c1=counter_gen(8)
c2=counter_gen(3)
for x in c1:
for y in c2:
print x,y
答案 0 :(得分:5)
c2
在3次迭代后到达终点。再次迭代它将无能为力。这就是“耗尽”迭代器的意思。所以,在三个项目之后,它会停止。你的外迭代器去了8次,但因为内部迭代器只去了3次,所以只有第一次外部迭代才能做任何事情。接下来的7个尝试迭代耗尽的迭代器,没有任何反应。
如果您希望c2
的 new 迭代从c1
的每次迭代开始,只需按照这种方式编写它!
c1=counter_gen(8)
for x in c1:
c2=counter_gen(3)
for y in c2:
print x, y
或者,完全取消c1
和c2
:
for x in counter_gen(8):
for y in counter_gen(3):
print x, y
答案 1 :(得分:1)
c1
和c2
是生成器对象。您可以迭代一次,然后进一步调用next()
将引发StopIteration
。在翻译中玩游戏应该会让你知道发生了什么:
>>> c1 = counter_gen(3)
>>> for item in c1:
pass
>>> c1.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> [i for i in c1] # Exhausted, will immediately raise StopIteration
[]
尝试在循环体中创建一个新的生成器:
for x in counter_gen(8):
for y in counter_gen(3):
print x,y