3秒でわかる
関数が処理を終えて呼び出し元へ渡す値のこと。計算した結果を次の処理へつなぐ出口にあたり、返し忘れると None や undefined が流れます。
もう少し詳しく
どういうものか
戻り値は、関数やメソッドが仕事を終えたときに呼び出し元へ手渡す値です。呼び出し側は total = calc(items) のように受け取り、その値を次の処理に使います。関数を「材料を入れると製品が出てくる箱」と考えると、引数が投入口、戻り値が取り出し口にあたります。
なぜ必要か
戻り値が無いと、関数の中で計算した結果は関数を抜けた瞬間に消えます。結果を外へ渡す方法は他にもありますが、グローバル変数へ書き込む方式は「どの関数がいつ書き換えたのか」を追えなくなり、バグの原因を特定できなくなります。戻り値で返す関数は、同じ引数を渡せば同じ値が返るため、単体テストがそのまま書けます。
具体例
def tax_included(price, rate=0.1):
return round(price * (1 + rate))
total = tax_included(1200)
print(total) # 1320
# return を書き忘れた関数は None を返す
def broken(price):
round(price * 1.1)
print(broken(1200)) # Nonereturn に到達した時点で関数は終わります。ループの中に return を書くと 1 周目で抜けてしまうため、全件を処理したい場合はリストへ貯めてから最後に返します。
つまずきやすいところ
初学者がもっとも多く踏むのは、画面に表示する print と戻り値を混同する誤りです。print は人間に見せるだけで、値を返してはいません。x = print("hi") と書くと x には None が入ります。もうひとつは、複数の値を返したいときに戻り値を 2 回書いてしまう間違いで、実際にはタプルやオブジェクトにまとめて 1 つとして返します。非同期の関数では、戻り値が結果そのものではなく、あとで結果が入る約束の値になります。受け取ってすぐ計算へ使うと中身が空に見えるため、待つ書き方が要ります。条件に合わない場合を先に return で弾く書き方は、入れ子が浅くなって読みやすくなります。
似た用語との違い
| 用語 | 指すもの |
|---|---|
| 戻り値 | 関数が呼び出し元へ返す値 |
| 引数 | 呼び出し元から関数へ渡す値 |
| 出力 | print などで画面や外部へ書き出すこと |
| 副作用 | 戻り値以外の形で外の状態を書き換えること |
戻り値だけで結果を返す関数は副作用が無く、テストのときに準備も後片付けも要りません。
覚え方
引数が入口、戻り値が出口。出口を作り忘れた関数は、中で何をしていても外からは何も起きていないように見えます。