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


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

Pythonの関数を書いていたときにふと疑問に感じたことが。

それは関数の途中で処理を終了したい場合に、returnと書くべきなのかreturn Noneと書くべきなのかという問題。

Pythonでは明示的に書くことが推奨されているため、return文で処理を終了するときもNoneを返すときもreturn Noneと書くべきなのかなぁと迷いました。(※Pythonでは、関数定義でreturnだけ書いた場合、あるいはreturnの記述が無い場合はNoneが返ってきます。参考:【Python】returnを記述しなかった関数が返す値

結論からいうと関数を終了したいだけのときはreturnだけの方が良いようです。
ただし、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の場合と同じでこのNoneは使うことが想定されていないため、戻り値を変数に代入するようなことはしてはいけません。

結論

  • 関数処理を中断したいだけのときはreturnを使う方がベター。
  • 戻り値のNoneを利用する場合はreturn Noneを使う。
  • 多重ループを一気に抜けるときはreturnは便利かも。
  • returnやreturn文なしの戻り値Noneは使わない。