【Python】yieldについて

f:id:hira98:20190630173301p:plain

【結論】

  • yieldを使うことで関数の処理を中断・再開することができる。

  • yieldを使うことで、「お昼はこれを食べよう😋」と決断する必要がなくなる。

  • 説明する上で図は必要だが、正確である必要は無いと考えている。

【目次】

はじめに

Pythonでは関数の戻り値を表す予約語として、returnyieldがあります。

returnが関数の処理を終了し値を返すのに対して、yieldは関数の処理を 一旦停止 し値を返します。一旦停止なので、yieldの処理は再開されます。

returnとyieldの検証ソース

日本語の解説をいくら読んでも私には「暖簾に腕押し」状態です。

よって、検証ソースを書いてみました。

def return_func():
  return 10
  return 20 # ここは無視される
  return 30 # ここも無視される

def yiled_func():
  yield 10
  yield 20
  yield 30

yf = yiled_func()
for i in range(1,4):
  r = return_func()
  y = next(yf)
  print(f"{i}回目:return_func:{r} yiled_func:{y}")

実行結果

1回目:return_func:10 yiled_func:10
2回目:return_func:10 yiled_func:20
3回目:return_func:10 yiled_func:30

図で表すと次のようにイメージになります。(注意:図はあくまで動作イメージを表すものであるため、サンプルソースの動作とは異なります。)

f:id:hira98:20190630173343p:plain

引用:http://ailaby.com/yield/

理解を深めるために

yieldを使うことで関数の処理を途中で中断させれることは理解できました。

より理解を深めるために、yieldを使ったサンプルソースを書いてみました。

サンプルソース

def launch_cycle(lanch_list):
    while(True):
        for lanch in lanch_list:
            yield lanch

lanch_list = ["すき家", "松屋", "吉野家"]
launch = launch_cycle(lanch_list)
for week in ["月", "火", "水", "木", "金"]:
    print(f"{week}:{next(launch)}")

実行結果

月:すき家
火:松屋
水:吉野家
木:すき家
金:松屋

後は、この結果をgoogleカレンダの予定に設定するPythonコードを書けば、お昼のランチを決める必要がなくなります☺️

おまけ

因みに、yieldを使って実装したlaunch_cycle()関数は、itertools.cycle()という標準関数が用意されていることに後で気付きました🤮

サンプルソース

import itertools
lanch_list = ["すき家", "松屋", "吉野家"]
launch = itertools.cycle(lanch_list)
for week in ["月", "火", "水", "木", "金"]:
    print(f"{week}:{next(launch)}")

実行結果

月:すき家
火:松屋
水:吉野家
木:すき家
金:松屋

参考情報

python の yield。サクッと理解するには return と比較 | コード7区

9. クラス — Python 3.7.4rc1 ドキュメント

itertools --- 効率的なループ実行のためのイテレータ生成関数 — Python 3.7.4rc1 ドキュメント

さいごに

yieldを理解をするにあたって図は必要でしたが、サンプルソースに合わせて図を書き直す気力はありませんでした。

そこで、商品パッケージでよく見かける「本画像は実際の商品とは異なる場合がございます。」という手法を採用しました。