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.

Lycon
quelle
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)
warvariuc
quelle
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()
Karl Knechtel
quelle
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()
heinrich5991
quelle
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.

Amin Jalali
quelle
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
user8541092
quelle
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]
praveen
quelle
2

Sie können dies versuchen

class select_choice():
    return x, y

a, b = test()
samuel161
quelle
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
kaushik karan
quelle