Come posso restituire due valori da una funzione in Python?


194

Vorrei restituire due valori da una funzione in due variabili separate. Per esempio:

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

E voglio essere in grado di usare questi valori separatamente. Quando ho provato a usare return i, card, restituisce a tuplee questo non è quello che voglio.


Fornisci un esempio di chiamata a questa funzione prevista e di utilizzo del / i suo / i valore / i di ritorno, in modo che sia chiaro il motivo per cui non vuoi tuple.
Bereal

2
Qual è il punto del ciclo while?
Sven Marnach,

dovrebbe avere un else: continueprima delle dichiarazioni di ritorno
desiderio di macchina


Sì, ho anche appena notato che questo è un duplicato di stackoverflow.com/questions/38508/...
lpapp

Risposte:


398

Non è possibile restituire due valori, ma è possibile restituire a tupleo a liste decomprimerlo dopo la chiamata:

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

my_i, my_card = select_choice()

On line return i, card i, cardsignifica creare una tupla. Puoi anche usare parentesi come return (i, card), ma le tuple sono create da una virgola, quindi le parentesi non sono obbligatorie. Ma puoi usare le parentesi per rendere il tuo codice più leggibile o per dividere la tupla su più righe. Lo stesso vale per la linea my_i, my_card = select_choice().

Se si desidera restituire più di due valori, considerare l'utilizzo di una tupla con nome . Consentirà al chiamante della funzione di accedere ai campi del valore restituito per nome, che è più leggibile. Puoi ancora accedere agli elementi della tupla per indice. Ad esempio nel Schema.loadsmetodo framework Marshmallow restituisce a UnmarshalResultche è a namedtuple. Quindi puoi fare:

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

o

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

In altri casi puoi restituire un dictdalla tua funzione:

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

Ma potresti voler considerare di restituire un'istanza di una classe di utilità, che avvolge i tuoi dati:

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

Vorrei restituire due valori da una funzione in due variabili separate.

Come ti aspetteresti che appaia alla fine della chiamata? Non puoi scrivere a = select_choice(); b = select_choice()perché ciò chiamerebbe la funzione due volte.

I valori non vengono restituiti "in variabili"; non è così che funziona Python. Una funzione restituisce valori (oggetti). Una variabile è solo un nome per un valore in un determinato contesto. Quando chiami una funzione e assegni il valore restituito da qualche parte, quello che stai facendo è dare un nome al valore ricevuto nel contesto chiamante. La funzione non inserisce il valore "in una variabile" per te, lo fa l'assegnazione (non importa che la variabile non sia "memoria" per il valore, ma ancora, solo un nome).

Quando ho provato a usare return i, card, restituisce un tuplee questo non è quello che voglio.

In realtà, è esattamente quello che vuoi. Tutto quello che devi fare è tuplesmontare di nuovo.

E voglio essere in grado di utilizzare questi valori separatamente.

Quindi basta prendere i valori da tuple.

Il modo più semplice per farlo è decomprimere:

a, b = select_choice()

1
Grazie per aver spiegato "perché è come è". Migliore risposta imo.
Edward Coelho,

17

Penso che quello che vuoi sia una tupla. Se lo usi return (i, card), puoi ottenere questi due risultati:

i, card = select_choice()

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

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

ora puoi fare tutto ciò che ti piace con la tua tupla.


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

E questa è un'alternativa.Se stai tornando come elenco, è semplice ottenere i valori.

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

values = select_choice()

print values[0]
print values[1]

2

puoi provare questo

class select_choice():
    return x, y

a, b = test()

1

È possibile restituire più di un valore utilizzando anche l'elenco. Controlla il codice qui sotto

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.