1

なぜ24行ではなく3行しか出力しないのか、そのメカニズムを誰かが説明できますか?

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 回繰り返した後に終了します。もう一度繰り返しても何も起こりません。これが、反復子を「使い果たす」という意味です。というわけで、3項目でストップ。外側のイテレータは 8 回実行されますが、内側のイテレータは 3 回しか実行されないため、最初の外側のイテレーションのみが実行されます。次の 7 は使い果たされた反復子を反復しようとしますが、何も起こりません。

の各反復で の新しい反復c2を開始したい場合はc1、そのように書くだけです!

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()が発生し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 に答える