return文で関数処理を終了したい場合はreturn None
とreturn
どちらを使うべきか?
Pythonの関数を書いていたときにふと疑問に感じたことが。
それは関数の途中で処理を終了したい場合に、return
と書くべきなのかreturn None
と書くべきなのかという問題。
Pythonでは明示的に書くことが推奨されているため、return文で処理を終了するときもNone
を返すときもreturn None
と書くべきなのかなぁと迷いました。(※Pythonでは、関数定義でreturn
だけ書いた場合、あるいはreturn
の記述が無い場合はNone
が返ってきます。参考:【Python】returnを記述しなかった関数が返す値)
例をあげてみる
return, return None, and no return at all? が参考になりました。例をあげて説明してみます。
return None
を使う
def hello_all():
persons = ['Zepp', 'Eric']
if persons:
for person in persons:
print('Hello ' + person)
# リストが空だったらNoneを返す
else:
return None
return
を使う
戻り値のNoneを使いたい場合に明示的にreturn None
と書くといいましたが、戻り値を使うのではなく関数を終了したい場合にはreturn
を使ってもOKです。下のコードではforループを抜けて関数を終了させるために使っています。
def hello_zepp():
persons = ['Zepp', 'Eric']
for person in persons:
print('Hello ' + person)
# 処理を終了
return
つまりforループが一重の場合にはbreak
と同じ働きをします。
多重forループでネストされたforループ内で処理を終了したい場合はbreak
と異なってreturn
を一つ書くだけで関数を終了できるので、コードが簡潔になります。
このようにreturn
を使う場合はループを抜ける場合など、強制的に関数の途中で処理を終了したい場合に使います。
注意すること
この場合、戻り値のNone
は使うことを想定していないと考えられるため、戻り値を変数に代入する使い方は多用するべきではないと個人的には思います。ただ、敢えて省略しているケースも多くあるとのことなので、ドキュメントに明示的に戻り値を書くなどすれば問題ないようです(コメント欄参照)。
result = hello_zepp()
また、関数を途中で終了したい場合には、条件に合わずに処理を中断したい場合も含まれると思います。そのような場合はreturn
を使うよりも、適切な例外クラスを作って例外をなげて、呼び出し元でエラーハンドリングをした方がよいケースもあるかもしれません。
return
の記述なし
Pythonの関数はreturn文を必ずしも必要としませんが、return文が無い場合でも戻り値としてNone
が返ってくるようになっています。
# return文は無いが戻り値としてNoneが返される
def hello_eric():
persons = ['Zepp', 'Eric']
print('Hello ' + persons[1])
結論
- 関数処理を中断したいだけのときは
return
を使う方がベター。 - 戻り値の
None
を利用する場合はreturn None
を使うとわかりやすい。 - 多重ループを一気に抜けるときは
return
は便利かも。