Betrachten Sie drei Funktionen:
def my_func1():
print "Hello World"
return None
def my_func2():
print "Hello World"
return
def my_func3():
print "Hello World"
Sie scheinen alle None zurückzugeben. Gibt es Unterschiede zwischen dem Verhalten des zurückgegebenen Werts dieser Funktionen? Gibt es Gründe, das eine dem anderen vorzuziehen?
return None
impliziert für mich, dass die Funktion manchmal einenNone
Rückgabewert hat, aber an der Stelle vonreturn None
gibt es keinen solchen Rückgabewert. Neinreturn
zu schreiben bedeutet für mich, dass es nie einen interessanten Rückgabewert gibt, ein bisschen wie eine "Prozedur" im Gegensatz zu einer "Funktion".return
impliziert, früh von einem "Verfahren" gemäß dem vorherigen Punkt zu existieren.Antworten:
Beim tatsächlichen Verhalten gibt es keinen Unterschied. Sie alle kehren zurück
None
und das war's. Für all dies gibt es jedoch eine Zeit und einen Ort. Die folgenden Anweisungen beschreiben im Wesentlichen, wie die verschiedenen Methoden verwendet werden sollten (oder zumindest, wie mir beigebracht wurde, dass sie verwendet werden sollten), aber sie sind keine absoluten Regeln, sodass Sie sie verwechseln können, wenn Sie dies für erforderlich halten.Verwenden von
return None
Dies zeigt an, dass die Funktion tatsächlich einen Wert für die spätere Verwendung zurückgeben soll, und in diesem Fall gibt sie zurück
None
. Dieser WertNone
kann dann an anderer Stelle verwendet werden.return None
wird niemals verwendet, wenn keine anderen möglichen Rückgabewerte von der Funktion vorhanden sind.Im folgenden Beispiel geben wir
person
s zurück,mother
wenn dasperson
Gegebene ein Mensch ist. Wenn es kein Mensch ist, kehren wir zurück,None
da derperson
kein hatmother
(nehmen wir an, es ist kein Tier oder so).Verwenden von
return
Dies wird aus dem gleichen Grund wie
break
in Schleifen verwendet. Der Rückgabewert spielt keine Rolle und Sie möchten nur die gesamte Funktion beenden. Es ist an einigen Stellen äußerst nützlich, obwohl Sie es nicht so oft benötigen.Wir haben 15
prisoners
und wir wissen, dass einer von ihnen ein Messer hat. Wir durchlaufen jedenprisoner
nach dem anderen, um zu überprüfen, ob sie ein Messer haben. Wenn wir die Person mit einem Messer schlagen, können wir die Funktion einfach beenden, weil wir wissen, dass es nur ein Messer gibt und keinen Grund, den Rest zu überprüfenprisoners
. Wenn wir dasprisoner
mit einem Messer nicht finden, lösen wir einen Alarm aus. Dies kann auf viele verschiedene Arten geschehen, und die Verwendungreturn
ist wahrscheinlich nicht einmal die beste, aber es ist nur ein Beispiel, um zu zeigen, wiereturn
eine Funktion beendet wird.Hinweis: Dies sollten Sie niemals tun
var = find_prisoner_with_knife()
, da der Rückgabewert nicht zum Abfangen gedacht ist.Mit nicht
return
überhauptDies wird ebenfalls zurückgegeben
None
, aber dieser Wert soll nicht verwendet oder abgefangen werden. Es bedeutet einfach, dass die Funktion erfolgreich beendet wurde. Es ist im Grunde das gleiche wiereturn
beivoid
Funktionen in Sprachen wie C ++ oder Java.Im folgenden Beispiel legen wir den Namen der Mutter der Person fest und die Funktion wird nach erfolgreichem Abschluss beendet.
Hinweis: Dies sollten Sie niemals tun
var = set_mother(my_person, my_mother)
, da der Rückgabewert nicht zum Abfangen gedacht ist.quelle
var = get_mother()
ist in Ordnung, wenn Sievar
zu anderen FunktionenNone
var = get_mother()
nicht verwendet werden kann? IMHO ist es völlig in Ordnung, das zu tun. Sie müssen nur sicherstellen, dass Sie nach einem Nicht-None
Wert suchen,if var
bevor Sie ihn verwenden.Ja, sie sind alle gleich.
Wir können den interpretierten Maschinencode überprüfen, um zu bestätigen, dass alle genau dasselbe tun.
quelle
dis.dis
kehrt zurückNone
: -Xdis.dis
auch einige ZeilennummernSie geben jeweils den gleichen Singleton zurück
None
- Es gibt keinen funktionalen Unterschied.Ich denke, dass es ziemlich idiomatisch ist, die
return
Aussage wegzulassen, es sei denn, Sie brauchen sie, um frühzeitig aus der Funktion auszubrechen (in diesem Fall ist ein nackter Fallreturn
häufiger) oder etwas anderes als zurückzugebenNone
. Es macht auch Sinn und scheint idiomatisch zu schreiben,return None
wenn es sich in einer Funktion befindet, die einen anderen Pfad hat, der etwas anderes zurückgibt alsNone
. Dasreturn None
explizite Ausschreiben ist ein visueller Hinweis für den Leser, dass es einen anderen Zweig gibt, der etwas Interessanteres zurückgibt (und dass der aufrufende Code wahrscheinlich beide Arten von Rückgabewerten verarbeiten muss).Oft in Python, Funktionen , die zurückkehren
None
werden wie verwendetvoid
Funktionen in C - Ihr Zweck im Allgemeinen auf die Eingabeargumente für den Betrieb ist in Ort (es sei denn , Sie globale Daten verwenden ( Schauder )). Bei der Rückgabe wirdNone
normalerweise deutlicher, dass die Argumente mutiert wurden. Dies macht etwas klarer, warum es sinnvoll ist, diereturn
Aussage unter dem Gesichtspunkt der "Sprachkonventionen" wegzulassen.Das heißt, wenn Sie in einer Codebasis arbeiten, die bereits voreingestellte Konventionen für diese Dinge hat, würde ich definitiv nachziehen, um der Codebasis zu helfen, einheitlich zu bleiben ...
quelle
return
Anweisung zu treffen , wird sie zurückgegebenNone
.Ruby
undJavascript
der gleiche Ansatz wie bei Python. Ich bin sicher , dass es sind Beispiele für Hochsprachen , die „Leere“ im Ausdruck sagen , aber ich kann von jedem im Moment nicht denken (vielleicht , wenn man bedenkt ,Java
eine höhere Programmiersprache) ... Wie würde Affe-Patchen Eine Funktion (die unter anderem zum Verspotten in Tests nützlich ist) funktioniert in einer hypothetischen Welt, in der Python einvoid
Schlüsselwort hat, das es so gemacht hat, dass die Funktion nichts zurückgibt? (Wie ich bereits sagte, müssen Sie mich nicht davon überzeugen, dass dies ein schlechtes Design ist. Ich kann nichts tun, auch wenn Sie Recht haben)Wie andere geantwortet haben, ist das Ergebnis genau das gleiche,
None
wird in allen Fällen zurückgegeben.Der Unterschied ist stilistisch, aber bitte beachten Sie, dass PEP8 eine konsistente Verwendung erfordert:
https://www.python.org/dev/peps/pep-0008/#programming-recommendations
Wenn Sie
None
in einer Funktion jemals einen Nichtwert zurückgeben, bedeutet dies im Grunde, dass der Rückgabewert eine Bedeutung hat und von Anrufern abgefangen werden soll. Wenn Sie also zurückkehrenNone
, muss es auch explizit sein, umNone
in diesem Fall zu vermitteln , dass es einer der möglichen Rückgabewerte ist.Wenn Sie überhaupt keine Rückgabe benötigen, funktioniert Ihre Funktion im Grunde genommen als Prozedur anstelle einer Funktion. Fügen Sie also die
return
Anweisung einfach nicht hinzu .Wenn Sie eine prozedurähnliche Funktion schreiben und die Möglichkeit besteht, früher zurückzukehren (dh Sie sind zu diesem Zeitpunkt bereits fertig und müssen den Rest der Funktion nicht ausführen), können Sie leere und
return
s verwenden, um dem Leser ein Signal zu geben Es ist nur ein frühes Ende der Ausführung und derNone
implizit zurückgegebene Wert hat keine Bedeutung und soll nicht abgefangen werden (die prozedurähnliche Funktion gibtNone
sowieso immer zurück ).quelle
In Bezug auf die Funktionalität sind diese alle gleich, der Unterschied zwischen ihnen liegt in der Lesbarkeit und dem Stil des Codes (was wichtig ist)
quelle