1

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

2 回答 2

5

c23 次迭代后到达终点。再次对其进行迭代将无济于事。这就是“耗尽”迭代器的意思。所以,在三个项目之后,它停止了。您的外部迭代器执行了 8 次,但由于内部迭代器仅执行了 3 次,因此只有第一个外部迭代器执行任何操作。接下来的 7 次尝试遍历用尽的迭代器,但没有任何反应。

如果您想从 的每次迭代开始的迭代,只需这样写!c2c1

c1=counter_gen(8)

for x in c1:
    c2=counter_gen(3)
    for y in c2:
        print x, y

或者,完全取消c1and c2

for x in counter_gen(8):
    for y in counter_gen(3):
        print x, y
于 2013-08-18T23:36:44.597 回答
1

c1并且c2是生成器对象。您可以遍历它们一次,然后进一步调用next()将 raise 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
于 2013-08-18T23:33:17.720 回答