Wie kann ich zwei Werte von einer Funktion in Python zurückgeben?


194

Ich möchte zwei Werte von einer Funktion in zwei separaten Variablen zurückgeben. Beispielsweise:

def select_choice():
    loop = 1
    row = 0
    while loop == 1:
        print('''Choose from the following options?:
                 1. Row 1
                 2. Row 2
                 3. Row 3''')

        row = int(input("Which row would you like to move the card from?: "))
        if row == 1:
            i = 2
            card = list_a[-1]
        elif row == 2:
            i = 1
            card = list_b[-1]
        elif row == 3:
            i = 0
            card = list_c[-1]
        return i
        return card

Und ich möchte diese Werte separat verwenden können. Wenn ich versucht habe return i, card, es zu verwenden , wird a zurückgegeben tupleund dies ist nicht das, was ich will.


Bitte geben Sie ein Beispiel für das Aufrufen dieser erwarteten Funktion und die Verwendung ihrer Rückgabewerte an, damit klar wird, warum Sie keine Tupel möchten.
Bereal

2
Was ist der Sinn der while-Schleife?
Sven Marnach

sollte eine else: continuevor der Rückkehr Aussagen haben
Maschine Sehnsucht


Ja, ich habe auch gerade bemerkt, dass dies ein Duplikat von stackoverflow.com/questions/38508/…
lpapp

Antworten:


398

Sie können nicht zwei Werte zurückgeben, aber Sie können a tupleoder a zurückgeben listund nach dem Aufruf entpacken:

def select_choice():
    ...
    return i, card  # or [i, card]

my_i, my_card = select_choice()

Auf der Leitung return i, card i, cardmittels eines Tupels zu schaffen. Sie können auch Klammern wie verwenden return (i, card), aber Tupel werden durch Komma erstellt, sodass Parens nicht obligatorisch sind. Sie können jedoch Parens verwenden, um Ihren Code besser lesbar zu machen oder das Tupel auf mehrere Zeilen aufzuteilen. Gleiches gilt für die Leitung my_i, my_card = select_choice().

Wenn Sie mehr als zwei Werte zurückgeben möchten, sollten Sie ein benanntes Tupel verwenden . Dadurch kann der Aufrufer der Funktion auf Felder des zurückgegebenen Werts nach Namen zugreifen, was besser lesbar ist. Sie können weiterhin über den Index auf Elemente des Tupels zugreifen. Zum Beispiel Schema.loadsgibt UnmarshalResultdas Marshmallow-Framework in der Methode a zurück, was a ist namedtuple. So können Sie tun:

data, errors = MySchema.loads(request.json())
if errors:
    ...

oder

result = MySchema.loads(request.json())
if result.errors:
    ...
else:
    # use `result.data`

In anderen Fällen können Sie a dictvon Ihrer Funktion zurückgeben:

def select_choice():
    ...
    return {'i': i, 'card': card, 'other_field': other_field, ...}

Möglicherweise möchten Sie jedoch eine Instanz einer Dienstprogrammklasse zurückgeben, die Ihre Daten umschließt:

class ChoiceData():
    def __init__(self, i, card, other_field, ...):
        # you can put here some validation logic
        self.i = i
        self.card = card
        self.other_field = other_field
        ...

def select_choice():
    ...
    return ChoiceData(i, card, other_field, ...)

choice_data = select_choice()
print(choice_data.i, choice_data.card)

26

Ich möchte zwei Werte von einer Funktion in zwei separaten Variablen zurückgeben.

Wie würden Sie erwarten, dass es auf der Anruferseite aussieht? Sie können nicht schreiben, a = select_choice(); b = select_choice()da dies die Funktion zweimal aufrufen würde.

Werte werden nicht "in Variablen" zurückgegeben. So funktioniert Python nicht. Eine Funktion gibt Werte (Objekte) zurück. Eine Variable ist nur ein Name für einen Wert in einem bestimmten Kontext. Wenn Sie eine Funktion aufrufen und den Rückgabewert irgendwo zuweisen, geben Sie dem empfangenen Wert im aufrufenden Kontext einen Namen. Die Funktion setzt den Wert nicht "in eine Variable" für Sie, sondern die Zuweisung (egal, dass die Variable kein "Speicher" für den Wert ist, sondern nur ein Name).

Wenn ich versucht habe zu verwenden return i, card, gibt es ein tupleund dies ist nicht das, was ich will.

Eigentlich ist es genau das, was Sie wollen. Alles was Sie tun müssen, ist das tuplewieder auseinander zu nehmen.

Und ich möchte diese Werte separat verwenden können.

Also schnapp dir einfach die Werte aus dem tuple.

Der einfachste Weg, dies zu tun, ist das Auspacken:

a, b = select_choice()

1
Vielen Dank für die Erklärung "warum es so ist wie es ist". Beste Antwort imo.
Edward Coelho

17

Ich denke du, was du willst, ist ein Tupel. Wenn Sie verwenden return (i, card), können Sie diese beiden Ergebnisse erhalten, indem Sie:

i, card = select_choice()

8
def test():
    ....
    return r1, r2, r3, ....

>> ret_val = test()
>> print ret_val
(r1, r2, r3, ....)

Jetzt können Sie mit Ihrem Tupel alles machen, was Sie wollen.


5
def test():
    r1 = 1
    r2 = 2
    r3 = 3
    return r1, r2, r3

x,y,z = test()
print x
print y
print z


> test.py 
1
2
3

2

Und dies ist eine Alternative. Wenn Sie als Liste zurückkehren, ist es einfach, die Werte zu erhalten.

def select_choice():
    ...
    return [i, card]

values = select_choice()

print values[0]
print values[1]

2

Sie können dies versuchen

class select_choice():
    return x, y

a, b = test()

1

Sie können auch mehr als einen Wert mithilfe der Liste zurückgeben. Überprüfen Sie den folgenden Code

def newFn():    #your function
  result = []    #defining blank list which is to be return
  r1 = 'return1'    #first value
  r2 = 'return2'    #second value
  result.append(r1)    #adding first value in list
  result.append(r2)    #adding second value in list
  return result    #returning your list

ret_val1 = newFn()[1]    #you can get any desired result from it
print ret_val1    #print/manipulate your your result
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.