【結論】
yield
を使うことで関数の処理を中断・再開することができる。yield
を使うことで、「お昼はこれを食べよう😋」と決断する必要がなくなる。説明する上で図は必要だが、正確である必要は無いと考えている。
【目次】
はじめに
Pythonでは関数の戻り値を表す予約語として、return
とyield
があります。
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
図で表すと次のようにイメージになります。(注意:図はあくまで動作イメージを表すものであるため、サンプルソースの動作とは異なります。)
理解を深めるために
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
を理解をするにあたって図は必要でしたが、サンプルソースに合わせて図を書き直す気力はありませんでした。
そこで、商品パッケージでよく見かける「本画像は実際の商品とは異なる場合がございます。」という手法を採用しました。