yield の動きがピンとこないので、動作を調べてみました。
return と yield の違いについて
return と yeild を比較してみます。
return
- 関数の処理の終了
- 値を返す
yeild
- 関数の処理を 一旦停止
- 再度実行の場合 (yeild の次行から)
- 値を返す
プログラム
yeild の挙動について(ループ)
yield がなくなるまで for 文が回ります。
def func(): foo_1 = 1 bar_1 = 2 yield foo_1 * bar_1 # いったん停止 foo_2 = 3 bar_2 = 4 yield foo_2 * bar_2 # いったん停止 for x in func(): print (x) #----- 結果 ----- # 2 # 12 #---------------
yeild の挙動について(ループ以外)
ループ以外の使い方です。先ほどと同じ関数を準備します。
def func(): foo_1 = 1 bar_1 = 2 yield foo_1 * bar_1 # いったん停止 foo_2 = 3 bar_2 = 4 yield foo_2 * bar_2 # いったん停止
yield を含む関数を呼び出すと generator が返ってきます。
>>> gen = func() # ジェネレータ >>> print(gen) <generator object func at 0x101176350>
__next__() を呼ぶと、yield までの処理を実行し、値を返します。
>>> gen.__next__() 2 >>> gen.__next__() 12
yield の数以上に __next__() を呼ぶと以下の例外が発生します。
>>> gen.__next__() Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration