Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

yield 構文がやっとピンと来たかもしれない

「yieldを実行すると、ジェネレーターを生成し現在の処理を中断したまま保持する事が出来ます」って何を言ってんのかサッパリわからなかった。やっとピンとくるコードがあった。

stackoverflow.com

# -*- 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で生成した値を見に行かないので、それまでの状態を保持するってことも理解できた。複数の違った値を返せるのも便利だな。

ここまでの話がストンと落ちたので、この話の意味も見えてきたわー

yieldのちょっとした理解