Pythonのyieldとreturnの違いとは?使い分けのポイントを徹底解説
結論から言うと、プログラムの制御がreturn文に到達すると、その時点で関数の実行は終了し、それ以降のステートメントは実行されません。
一方、yieldの場合は、制御がyield文に到達するとプログラムの実行が一時停止し、後から関数内の残りの処理を続きとして実行できるのが大きな特徴です。
以下では、両者の動作について詳しく見ていきましょう。
yieldとは
関数内でyield文を使用すると、その関数は「ジェネレータ関数」となり、forループなどの反復処理で利用できるようになります。関数が実行されてyield文が評価されると、その直後に指定された値が呼び出し元のループへ返されます。そして次にループが回るとき、関数はyield文の直後から処理を再開します。
def func(): yield 1 yield 2 yield 3 for num in func(): print(num * num)
出力結果
1 4 9
上記のプログラムでは、関数func()が完了したとき、つまり関数の末尾に達したとき、あるいはreturn文に到達したときに、呼び出し元のループも終了します。
ただし、同じジェネレータ関数を使う新しいループでは、関数は必ず最初から再度実行される点に注意してください。
returnとは
return文には、以下のような特徴があります。
関数の実行を停止し、必要に応じて呼び出し元へ値を返すために使用されます。
returnを持つ(ただしyieldを持たない)関数は、ループによる反復処理に使うことができません(前述のyieldとは異なる点です)。一度実行された関数を再度呼び出すと、関数は必ず最初から実行されます(これも
yieldとは異なる挙動です)。
yieldとreturnはいつ使い分けるべきか?
シーケンス(一連の値)を順番に処理したい場合、特にリソースの制約がある場合や、シーケンス全体をメモリに保持したくない場合には、yieldの使用が推奨されます。それ以外のケースでは、return文の使用を検討するとよいでしょう。
次に、yieldを使って整数の平方を生成する別の例を見てみましょう。
def Square(): i = 1 # 平方数を生成する無限ループ while True: yield i*i i += 1 # 次回の実行はここから再開される for num in Square(): if num > 100: break print(num)
出力結果
1 4 9 16 25 36 49 64 81 100
このように、yieldを使えば無限に続く数列でも、必要な分だけを都度生成しながら処理できます。
なお、yield文は一般的に try ... finally ブロックの try 節内では使用しないことが推奨されています。ジェネレータが再開される保証がないため、finallyブロックが実行される保証もないからです。
-
ExcelでVLOOKUPの代わりにINDEX-MATCHを使うべき理由と具体的な使い方
Excelを日常的に使っている方なら、VLOOKUP関数はすでにお馴染みでしょう。VLOOKUPは、同じ行内の一致するテキストをもとに、別のセルから値を検索して取得できる非常に便利な関数です。 まだVLOOKUPに慣れていないという方は、まず基本的な使い方を解説した入門記事を確認しておくと理解がスムーズになります。 しかし、VLOOKUPは強力な反面、参照元の表の構造に制約があるという大きな弱点を抱えています。本記事では、VLOOKUPでは対応できないケースを具体例とともに紹介し、その問題を解決できるINDEX-MATCH関数の使い方を詳しく解説します。 INDEX-MATCHの実例:車のデ
-
Pythonの関数で図(Figure)を返す方法【Matplotlib活用】
PythonでMatplotlibを使って、関数から図(Figureオブジェクト)を返す方法を解説します。グラフ描画処理を関数化することで、コードの再利用性が高まり、複数のグラフを効率的に扱えるようになります。実装の手順figureサイズを設定し、サブプロット間および周囲のパディングを調整します。numpyを使用してxとyのデータポイントを作成します。新しい図を作成、または既存の図をアクティブにするfigure()メソッドを使った関数plot(x, y)を定義します。plot()メソッドでxとyのデータポイントを描画し、figインスタンスを返します。plot(x, y)関数を呼び出し、戻り値の