web-dev-qa-db-de.com

Wie gibt Python mehrere Werte aus einer Funktion zurück?

Ich habe folgenden Code geschrieben:

class FigureOut:
   def setName(self, name):
      fullname = name.split()
      self.first_name = fullname[0]
      self.last_name = fullname[1]

   def getName(self):
      return self.first_name, self.last_name

f = FigureOut()
f.setName("Allen Solly")
name = f.getName()
print (name)

Ich bekomme die folgende Ausgabe:

('Allen', 'Solly')

Wenn in Python von einer Funktion mehrere Werte zurückgegeben werden, konvertiert diese immer die mehreren Werte in eine Liste von mehreren Werten und gibt sie dann von der Funktion zurück?

Ist der gesamte Prozess dasselbe wie das explizite Konvertieren mehrerer Werte in eine list und das Zurückgeben der Liste, beispielsweise in Java, da in JAVA nur ein Objekt aus einer Funktion zurückgegeben werden kann?

20
User_Targaryen

Da die return-Anweisung in getNamemultiple Elemente angibt:

def getName(self):
   return self.first_name, self.last_name

Python gibt ein Containerobjekt zurück, das sie im Wesentlichen enthält. 

Wenn Sie in diesem Fall eine durch durch Kommas getrennte Gruppe zurückgeben, wird a Tuple erstellt. Mehrere Werte können nur in Containern zurückgegeben werden.

Verwenden Sie eine einfachere Funktion, die mehrere Werte zurückgibt:

def foo(a, b):
    return a, b

Sie können den Bytecode anzeigen, der mit dis.dis , einem Disassembler für Python-Bytecode, generiert wurde. Bei durch Kommas getrennten Werten ohne Klammern sieht es so aus:

>>> import dis
>>> def foo(a, b):
...     return a,b        
>>> dis.dis(foo)
  2           0 LOAD_FAST                0 (a)
              3 LOAD_FAST                1 (b)
              6 BUILD_Tuple              2
              9 RETURN_VALUE

Wie Sie sehen, werden die Werte zuerst mit LOAD_FAST in den internen Stapel geladen, und anschließend wird ein BUILD_Tuple (greifen die vorherigen 2-Elemente, die auf dem Stapel abgelegt sind) erstellt. Python kann aufgrund der vorhandenen Kommas ein Tuple erstellen.

Sie können alternativ einen anderen Rückgabetyp angeben, z. B. eine Liste, indem Sie [] verwenden. In diesem Fall wird ein BUILD_LIST mit derselben Semantik ausgegeben, wie er mit Tuple gleichwertig ist:

>>> def foo_list(a, b):
...     return [a, b]
>>> dis.dis(foo_list)
  2           0 LOAD_FAST                0 (a)
              3 LOAD_FAST                1 (b)
              6 BUILD_LIST               2
              9 RETURN_VALUE

Die Art des zurückgegebenen Objekts hängt wirklich vom Vorhandensein von Klammern ab (für Tupel kann () weggelassen werden, wenn mindestens ein Komma vorhanden ist). [] erstellt Listen und {}-Sets. Wörterbücher benötigen key:val Paare.

Zusammenfassend wird ein aktuelles Objekt zurückgegeben. Wenn es sich bei diesem Objekt um einen Containertyp handelt, kann es mehrere Werte enthalten, die den Eindruck mehrerer zurückgegebener Ergebnisse vermitteln. Die übliche Methode ist dann, sie direkt auszupacken:

>>> first_name, last_name = f.getName()
>>> print (first_name, last_name)

Abgesehen von all dem dringen Ihre Java-Wege in Python ein :-) 

Verwenden Sie beim Schreiben von Klassen in Python keine Getter, sondern properties. Eigenschaften sind die idiomatische Methode zum Verwalten von Attributen. Weitere Informationen hierzu finden Sie in einer Nice-Antwort hier .

Aus Python-Kochbuch v.30

def myfun():
    return 1, 2, 3

a, b, c = myfun()

Obwohl es so aussieht, als würde myfun() mehrere Werte zurückgeben, wird tatsächlich eine Tuple erstellt. Es sieht ein bisschen seltsam aus, aber es ist eigentlich das Komma, das einen Tupel bildet, nicht die Klammern

Ja, was in Python vor sich geht, ist eine interne Umwandlung von mehreren durch Kommas getrennten Werten in einen Tuple und umgekehrt. 

In Java gibt es kein Äquivalent./Sie können dieses Verhalten leicht mit array oder einigen Collections wie Lists erzeugen:

private static int[] sumAndRest(int x, int y) {
    int[] toReturn = new int[2];

    toReturn[0] = x + y;
    toReturn[1] = x - y;

    return toReturn;

}

So ausgeführt:

public static void main(String[] args) {
    int[] results = sumAndRest(10, 5);

    int sum  = results[0];
    int rest = results[1];

    System.out.println("sum = " + sum + "\nrest = " + rest);

}

ergebnis:

sum = 15
rest = 5
18
joc

Hier gibt es tatsächlich Tuple zurück.

Wenn Sie diesen Code in Python 3 ausführen: 

def get():
    a = 3
    b = 5
    return a,b
number = get()
print(type(number))
print(number)

Ausgabe : 

<class 'Tuple'>
(3, 5)

Wenn Sie jedoch die Codezeile return [a,b] anstelle von return a,b ändern und Folgendes ausführen: 

def get():
    a = 3
    b = 5
    return [a,b]
number = get()
print(type(number))
print(number)

Ausgabe :

<class 'list'>
[3, 5]

Es wird nur ein einzelnes Objekt zurückgegeben, das mehrere Werte enthält. 

Es gibt eine andere Alternative zur return-Anweisung, um mehrere Werte zurückzugeben. Verwenden Sie yield (zum Einchecken der Details siehe dies Was bewirkt das Schlüsselwort "yield" in Python? )

Beispielbeispiel:

def get():
    for i in range(5):
        yield i
number = get()
print(type(number))
print(number)
for i in number:
    print(i)

Ausgabe :

<class 'generator'>
<generator object get at 0x7fbe5a1698b8>
0
1
2
3
4
6
Kalpesh Dusane

Python-Funktionen geben immer einen eindeutigen Wert zurück. Der Kommaoperator ist der Konstruktor von Tupeln, so dass self.first_name, self.last_name zu einem Tuple ausgewertet wird und Tuple der tatsächliche Wert ist, den die Funktion zurückgibt.

3
Goyo

Wann immer mehrere Werte von einer Funktion in Python zurückgegeben werden, konvertiert sie immer die mehreren Werte in eine list aus mehreren Werten und gibt sie dann von der Funktion ??. 

Ich füge nur einen Namen hinzu und drucke das Ergebnis, das von der Funktion zurückgegeben wird. Der Typ des Ergebnisses ist 'Tuple'.

  class FigureOut:
   first_name = None
   last_name = None
   def setName(self, name):
      fullname = name.split()
      self.first_name = fullname[0]
      self.last_name = fullname[1]
      self.special_name = fullname[2]
   def getName(self):
      return self.first_name, self.last_name, self.special_name

f = FigureOut()
f.setName("Allen Solly Jun")
name = f.getName()
print type(name)


Ich weiß nicht, ob Sie von 'first class function' gehört haben. Python ist die Sprache, die ' first class function ' hat 

Ich hoffe, meine Antwort könnte Ihnen helfen. Glückliche Kodierung.

2
Junsuk Park

erwähnt auch hier kannst du folgendes verwenden:

import collections
Point = collections.namedtuple('Point', ['x', 'y'])
p = Point(1, y=2)
>>> p.x, p.y
1 2
>>> p[0], p[1]
1 2
0
Ghazal