ものづくりのブログ

うちのネコを題材にしたものづくりができたらいいなと思っていろいろ奮闘してます。

【python】 yield の動きを調べてみる

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