7
8

More than 1 year has passed since last update.

【Python】returnとreturn Noneどちらを使うべきか

Last updated at Posted at 2020-04-12

return文で関数処理を終了したい場合はreturn Nonereturnどちらを使うべきか?

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を使う場合はループを抜ける場合など、強制的に関数の途中で処理を終了したい場合に使います。

:no_good: 注意すること

この場合、戻り値の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は便利かも。
7
8
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8