次の 3 つの関数について考えてみましょう。
def my_func1():
print "Hello World"
return None
def my_func2():
print "Hello World"
return
def my_func3():
print "Hello World"
これらはすべて を返すようですNone
。これらの関数の戻り値の動作に違いはありますか? どちらか一方を優先する理由はありますか?
ベストアンサー1
実際の動作には違いはありません。すべて戻りNone
、それで終わりです。ただし、これらすべてには適切なタイミングと場所があります。以下の手順は、基本的にさまざまな方法の使用方法 (少なくとも私が教わった使用方法) ですが、絶対的なルールではないため、必要に応じて組み合わせることができます。
使用return None
これは、関数が実際に後で使用するために値を返すことを意図していることを示していますNone
。この場合は を返します。この値はNone
他の場所で使用できます。return None
関数から他の戻り値がない場合、 は使用されません。
次の例では、指定された が人間である場合はperson
を返します。人間でない場合は、に がないため(動物などではないと仮定します)、 を返します。mother
person
None
person
mother
def get_mother(person):
if is_human(person):
return person.mother
else:
return None
使用return
これはループの場合と同じ理由で使用されますbreak
。戻り値は重要ではなく、関数全体を終了したいだけです。頻繁に必要になるわけではありませんが、いくつかの場所では非常に便利です。
15 人いてprisoners
、そのうちの 1 人がナイフを持っていることがわかっています。1 人ずつループして、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
まったく使用しない
これも を返しますが、その値は使用したりキャッチしたりするためのものではありません。単に関数が正常に終了したことを意味します。基本的には、C++ や Java などの言語の関数とNone
同じです。return
void
次の例では、人の母親の名前を設定し、正常に完了すると関数が終了します。
def set_mother(person, mother):
if is_human(person):
person.mother = mother
注意:var = set_mother(my_person, my_mother)
戻り値はキャッチされることを意図していないため、 は決して実行しないでください。