なぜ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
c2
3 回繰り返した後に終了します。もう一度繰り返しても何も起こりません。これが、反復子を「使い果たす」という意味です。というわけで、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
または、c1
and をc2
完全に廃止します。
for x in counter_gen(8):
for y in counter_gen(3):
print x, y
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