Angenommen, ich habe eine Python-Funktion, die mehrere Werte in einem Tupel zurückgibt:
def func():
return 1, 2
Gibt es eine gute Möglichkeit, eines der Ergebnisse zu ignorieren, anstatt es nur einer temporären Variablen zuzuweisen? Sagen Sie, wenn ich nur am ersten Wert interessiert war, gibt es einen besseren Weg als diesen:
x, temp = func()
~
als Syntax zum Ignorieren einer bestimmten Rückgabevariablen verwendet wurdenAntworten:
Eine übliche Konvention besteht darin, ein "_" als Variablennamen für die Elemente des Tupels zu verwenden, die Sie ignorieren möchten. Zum Beispiel:
quelle
Sie können verwenden
x = func()[0]
, um den ersten Wert zurückzugeben,x = func()[1]
um den zweiten zurückzugeben und so weiter.Wenn Sie mehrere Werte gleichzeitig erhalten möchten, verwenden Sie so etwas wie
x, y = func()[2:4]
.quelle
func()[2:4]
wenn Sie nur einige der Rückgabewerte möchten ._, _, _, _, _, _, _, _, _, _, _, _, _, a, _, _, _, _, _, _, _, _, _, _, _, b, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, c, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, d, _, _, _, _, _, _, _, _, e, _ = func()
ist weniger klar als die Funktion mehrmals aufzurufen, aber das ist nur meine Meinung. Wenn Ihre Funktion so viele Elemente zurückgibt, ist die Verwendung von numpy meiner Meinung nach vorzuziehen:a, b, c, d, e = func()[[13, 25, 58, 89, 98]]
result = func()
a = result[13]
b = result[25]
...x, __, y = func()
Wenn Sie Python 3 verwenden, können Sie den Stern vor einer Variablen (auf der linken Seite einer Zuweisung) verwenden, damit diese beim Entpacken als Liste angezeigt wird.
quelle
a, *_ = f()
beliebige Anzahl von zurückgegebenen Werten nach ignorierena
.Denken Sie daran, wenn Sie mehr als einen Artikel zurückgeben, geben Sie wirklich ein Tupel zurück. Sie können also Folgendes tun:
quelle
Es ist üblich, die Dummy-Variable
_
(einzelner Unterstrich) zu verwenden, wie viele hier bereits angegeben haben.Um jedoch Kollisionen mit anderen Verwendungen dieses Variablennamens zu vermeiden (siehe diese Antwort), ist es möglicherweise besser,
__
stattdessen (doppelter Unterstrich) als Wegwerfvariable zu verwenden , wie von ncoghlan angegeben . Z.B:quelle
a, _, _ = 1,8,9
. Bis zu diesem Zeitpunkt wird das Ergebnis der zuletzt ausgeführten Anweisung gespeichert. Wenn Sie abfangen möchten, verwenden Sie normalerweise eine Variable, um diesen Wert zu speichern. Aus diesem Grund ist '_' der vorgeschlagene Variablenname zum Abfangen von Junk-Werten. '_' Werte werden überschrieben, sobald eine andere Anweisung ausgeführt wird. Im Fall von '_ _' bleibt der Wert dort, bis GC ihn bereinigt.Drei einfache Möglichkeiten.
Offensichtlich
Schrecklich
Und es gibt Möglichkeiten, dies mit einem Dekorateur zu tun.
quelle
_
Variable wirklich . Es ist sehr offensichtlich, dass Sie einen Wert ignorierenx, _ = func()
ist abscheulich undx = func()[0]
offensichtlich. Einer Variablen zuweisen und dann nicht verwenden? Die Funktion gibt ein Tupel zurück. indiziere es wie ein Tupel.;)
, Accessoren Liste wiea[0]
,a[:]
(Liste kopieren),a[::2]
(alle zwei Elemente) unda[i:] + a[:i]
(drehen , um eine Liste), ist in der Tat, auch offensichtlich , und kanonisch.Die beste Lösung besteht wahrscheinlich darin, Dinge zu benennen, anstatt bedeutungslose Tupel zurückzugeben. Es sei denn, hinter der Reihenfolge der zurückgegebenen Artikel steht eine Logik.
Sie können sogar namedtuple verwenden, wenn Sie zusätzliche Informationen zu Ihrer Rückgabe hinzufügen möchten (es handelt sich nicht nur um ein Wörterbuch, sondern um Koordinaten):
Wenn die Objekte in Ihrem Wörterbuch / Tupel stark miteinander verbunden sind, ist es möglicherweise eine gute Idee, sogar eine Klasse dafür zu definieren. Auf diese Weise können Sie auch die Interaktion zwischen Objekten dieses Typs definieren und eine API für die Arbeit mit ihnen angeben. Eine natürliche Frage, die folgt: Wann sollte ich Klassen in Python verwenden? .
quelle
Dies scheint mir die beste Wahl zu sein:
Es ist nicht kryptisch oder hässlich (wie die Methode func () [index]) und gibt Ihren Zweck klar an.
quelle
Dies ist keine direkte Antwort auf die Frage. Vielmehr beantwortet es diese Frage: "Wie wähle ich eine bestimmte Funktionsausgabe aus vielen möglichen Optionen aus?".
Wenn Sie die Funktion schreiben können (dh sie befindet sich nicht in einer Bibliothek, die Sie nicht ändern können), fügen Sie ein Eingabeargument hinzu, das angibt, was Sie von der Funktion erwarten. Machen Sie es zu einem benannten Argument mit einem Standardwert, damit Sie es im "allgemeinen Fall" nicht einmal angeben müssen.
Diese Methode gibt die Funktion "Erweiterte Warnung" bezüglich der gewünschten Ausgabe. Folglich kann es unnötige Verarbeitung überspringen und nur die Arbeit erledigen, die erforderlich ist, um die gewünschte Ausgabe zu erhalten. Da Python dynamisch tippt, kann sich auch der Rückgabetyp ändern. Beachten Sie, wie das Beispiel einen Skalar, eine Liste oder ein Tupel zurückgibt ... was auch immer Sie möchten!
quelle
Wenn dies eine Funktion ist, die Sie ständig verwenden, aber immer das zweite Argument verwerfen, würde ich argumentieren, dass es weniger umständlich ist, einen Alias für die Funktion zu erstellen, ohne dass der zweite Rückgabewert verwendet wird
lambda
.quelle
Wenn Sie viele Ausgaben von einer Funktion haben und diese nicht mehrmals aufrufen möchten, ist meiner Meinung nach der klarste Weg zur Auswahl der Ergebnisse:
Als Mindestarbeitsbeispiel wird auch gezeigt, dass die Funktion nur einmal aufgerufen wird:
Und die Werte sind wie erwartet:
Zur Vereinfachung können auch Python-Listenindizes verwendet werden:
Rückgabe: a = 3 und b = 12
quelle