「yieldを実行すると、ジェネレーターを生成し現在の処理を中断したまま保持する事が出来ます」って何を言ってんのかサッパリわからなかった。やっとピンとくるコードがあった。
# -*- coding: utf-8 -*- def f(): yield 1 yield 2 yield 3 gen = f() #ジェネレータオブジェクトが返ってくるだけで #実際の値は関数を呼んでも生成されない。 #ジェネレータはイテレータの1種だから、 #forで回さないと値を生成しない print(f) for i in gen: print(i) #yieldは1度しか生成しない。再利用は不可。 #なのでこのループは実行されない for i in gen: print(i) gen2 = f() #nextを呼べばyieldで作成した値を順番に取得できる print(gen2.next()) print(gen2.next()) print(gen2.next())
なるほどね・・・!
yield文はイテレータを生成するからジェネレータという話なんだな。限定的な遅延評価が出来るってことか。nextを呼ばない限りはyieldで生成した値を見に行かないので、それまでの状態を保持するってことも理解できた。複数の違った値を返せるのも便利だな。
ここまでの話がストンと落ちたので、この話の意味も見えてきたわー