回答:
実際の動作には違いはありません。彼らはすべて戻ってきて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人がナイフを持っていることを知っています。それぞれをprisoner1つずつループして、ナイフがあるかどうかを確認します。ナイフで人に当たった場合、ナイフは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ますが、その値は使用またはキャッチされることを意図していません。それは単に関数が正常に終了したことを意味します。基本的には同じですreturnでvoid、このようなC ++やJavaなどの言語で機能します。
次の例では、人の母親の名前を設定し、関数は正常に完了した後に終了します。
def set_mother(person, mother):
if is_human(person):
person.mother = mother
注:var = set_mother(my_person, my_mother)戻り値はキャッチされることを意図していないため、絶対に実行しないでください。
var = get_mother()var受け入れる他の関数にパスしている場合は問題ありませんNone-「決して」は少し極端です
var = get_mother()使用できない場合、戻り値をどのように受け入れる必要がありますか?私見それを行うのは全く問題ありません。None値をif var使用する前に、値がないかどうかを確認する必要があります。
はい、すべて同じです。
解釈されたマシンコードを確認して、それらがすべてまったく同じことを行っていることを確認できます。
import dis
def f1():
print "Hello World"
return None
def f2():
print "Hello World"
return
def f3():
print "Hello World"
dis.dis(f1)
4 0 LOAD_CONST 1 ('Hello World')
3 PRINT_ITEM
4 PRINT_NEWLINE
5 5 LOAD_CONST 0 (None)
8 RETURN_VALUE
dis.dis(f2)
9 0 LOAD_CONST 1 ('Hello World')
3 PRINT_ITEM
4 PRINT_NEWLINE
10 5 LOAD_CONST 0 (None)
8 RETURN_VALUE
dis.dis(f3)
14 0 LOAD_CONST 1 ('Hello World')
3 PRINT_ITEM
4 PRINT_NEWLINE
5 LOAD_CONST 0 (None)
8 RETURN_VALUE
dis.dis戻り値None:-X
dis.disいくつかの行番号が報告されていると思うので、直接比較しても機能しない場合があります...
それらはそれぞれ同じシングルトンを返しますNone-機能的な違いはありません。
return関数から早く抜け出す必要がある場合(この場合はベアのreturn方が一般的です)、または以外のものを返す必要がない限り、ステートメントを省略するのはかなり慣用的だと思いますNone。それは理にかなっておりreturn None、それが以外のものを返す別のパスを持つ関数内にあるときに書くのは慣用的なようですNone。書き込みreturn None明示的にはもっと面白い(とコードを呼び出すと、おそらく、戻り値の両方のタイプを処理する必要があることを)何かを返す別のブランチがあることを読者に視覚的な手がかりです。
多くの場合、Pythonでは、返さNoneれるvoid関数はCの関数のように使用されます-その目的は、一般に、入力引数を適切に操作することです(グローバルデータ(shudders)を使用している場合を除く)。None通常、戻ることにより、引数が変更されたことがより明確になります。これによりreturn、「言語の慣習」の観点からステートメントを省略することが理にかなっている理由がもう少し明確になります。
とは言っても、これらの事柄に関して事前に決められた規則が既にあるコードベースで作業している場合は、コードベースが統一された状態を維持できるように、私は間違いなく追随します...
RubyとJavascriptのpythonと同じアプローチを取ります。表現に「ボイド」と言っている高級言語の例は確かにありますが、現時点では考えられません(おそらくJava、高級言語を考えれば)...サルのパッチはどうでしょうか。関数(とりわけテストのモックに役立つ)は、Pythonがvoidキーワードを取得して関数が何も返さないという架空の世界で機能しますか?(また、前に述べたように、これが悪いデザインであることを私に納得させる必要はありません。正しいとしても、私は何もできません)
他の人が答えたように、結果はまったく同じでNoneあり、すべての場合に返されます。
違いは文体的なものですが、PEP8では一貫した使用が必要であることに注意してください。
returnステートメントで一貫している。関数内のすべてのreturnステートメントが式を返すか、どれも返さないかのどちらかです。returnステートメントが式を返す場合、値が返されないすべてのreturnステートメントは、これをreturn Noneとして明示的に示す必要があり、明示的なreturnステートメントが関数の最後にある必要があります(到達可能な場合)。
はい:
def foo(x): if x >= 0: return math.sqrt(x) else: return None def bar(x): if x < 0: return None return math.sqrt(x)番号:
def foo(x): if x >= 0: return math.sqrt(x) def bar(x): if x < 0: return return math.sqrt(x)
https://www.python.org/dev/peps/pep-0008/#programming-recommendations
基本的Noneに、関数で値以外を返す場合、それは戻り値に意味があり、呼び出し元によってキャッチされることを意味します。したがって、を返すときはNone、それも明示的である必要があります。Noneこの場合、意味があることを伝えるために、これは可能な戻り値の1つです。
返す必要がない場合、関数は基本的に関数ではなくプロシージャとして機能するため、returnステートメントを含めないでください。
プロシージャのような関数を作成していて、前に戻る機会がある場合(つまり、その時点ですでに完了しており、残りの関数を実行する必要がない場合)、空のreturnsを使用してリーダーに信号を送ることができます。これは実行の初期段階に過ぎず、None暗黙的に返される値には意味がなく、キャッチすることを意図していません(プロシージャのような関数は常にNoneとにかく戻ります)。
機能の点ではこれらはすべて同じですが、それらの違いはコードの可読性とスタイル(検討することが重要です)です。
return None関数には非None戻り値が含まれる場合があるが、の場所return Noneにはそのような戻り値がないことを意味します。「no」returnと書くことは、「関数」ではなく「プロシージャ」のような興味深い戻り値がないことを意味します。return前のポイントの「手順」から早期に存在することを意味します。