请在此示例中解释生成器机制

时间:2013-08-18 23:26:38

标签: python generator

有人可以解释为什么它只打印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

2 个答案:

答案 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

或者,完全取消c1c2

for x in counter_gen(8):
    for y in counter_gen(3):
        print x, y

答案 1 :(得分:1)

c1c2是生成器对象。您可以迭代一次,然后进一步调用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