1. ホーム
  2. python

[解決済み] return, return None, and no return at all?

2022-02-17 23:15:02

質問

3つの関数を考えてみましょう。

def my_func1():
  print "Hello World"
  return None

def my_func2():
  print "Hello World"
  return

def my_func3():
  print "Hello World"

これらはすべてNoneを返すように見えます。これらの関数の戻り値の動作に違いはあるのでしょうか? また、どちらかを選ぶべき理由はありますか?

どのように解決するのですか?

実際の動作では、違いはありません。いずれも None で終わりです。しかし、これらにはすべて時と場合があります。 以下の説明は、基本的にそれぞれのメソッドをどのように使うべきか(少なくとも私が教わった方法)ですが、絶対的なルールではないので、必要だと感じたらそれらを混ぜて使うことも可能です。

使用方法 return None

これは、この関数が後で使用するための値を返すことを意図していることを表しています。 None . この値 None は、他の場所で使用することができます。 return None は、関数の戻り値が他にない場合は、決して使用されません。

次の例では person 's mother もし person は人間である。もし人間でない場合は None というのは person を持たないので mother (仮に動物などではないとします)。

def get_mother(person):
    if is_human(person):
        return person.mother
    else:
        return None

使用方法 return

と同じ理由で使用されます。 break をループで使用します。戻り値は重要ではなく、関数全体を終了させたいだけなのです。それほど頻繁に必要としないにもかかわらず、場所によっては非常に便利です。

私たちは、15 prisoners その中の一人がナイフを持っていることが分かっています。それぞれの prisoner を1つずつチェックし、ナイフを持っているかどうかを確認します。もしナイフを持った人に当たったら、ナイフは一本だけなので、この関数を終了すればいいのです。 prisoners . が見つからなかったら prisoner をナイフで刺すと、アラートが発生します。これは様々な方法で行うことができますし return はベストな方法ではないかもしれませんが、あくまで例として return 関数の終了に使用します。

def find_prisoner_with_knife(prisoners):
    for prisoner in prisoners:
        if "knife" in prisoner.items:
            prisoner.move_to_inquisition()
            return # no need to check rest of the prisoners nor raise an alert
    raise_alert()

注:決して var = find_prisoner_with_knife() というのも、その返り値はキャッチされることを意図していないからです。

を使用しない return を使用します。

また、これは None しかし、この値は使用したり、捕捉したりするためのものではありません。単に関数が正常に終了したことを意味します。これは基本的に returnvoid C++やJavaなどの言語における関数です。

次の例では、人の母親の名前を設定し、関数が正常に終了した後に終了しています。

def set_mother(person, mother):
    if is_human(person):
        person.mother = mother

注:決して var = set_mother(my_person, my_mother) というのも、その返り値はキャッチされることを意図していないからです。