¿Cómo puedo devolver dos valores de una función en Python?

195

Me gustaría devolver dos valores de una función en dos variables separadas. Por ejemplo:

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

Y quiero poder usar estos valores por separado. Cuando traté de usar return i, card, devuelve un tupley esto no es lo que quiero.

Lycon
fuente
Proporcione un ejemplo de llamar a esta función esperada y usar sus valores de retorno, para que quede claro por qué no quiere tuplas.
bereal
2
¿Cuál es el punto del ciclo while?
Sven Marnach
debe tener un else: continueantes de las declaraciones de devolución
máquina anhelo
Sí, también me di cuenta de que este es un duplicado de stackoverflow.com/questions/38508/…
lpapp

Respuestas:

399

No puede devolver dos valores, pero puede devolver a tupleo a listy descomprimirlo después de la llamada:

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

my_i, my_card = select_choice()

En línea return i, card i, cardsignifica crear una tupla. También puede usar paréntesis return (i, card), pero las tuplas se crean por comas, por lo que los parens no son obligatorios. Pero puede usar parens para hacer que su código sea más legible o para dividir la tupla en varias líneas. Lo mismo se aplica a la línea my_i, my_card = select_choice().

Si desea devolver más de dos valores, considere usar una tupla con nombre . Permitirá al llamante de la función acceder a los campos del valor devuelto por nombre, lo que es más legible. Aún puede acceder a los elementos de la tupla por índice. Por ejemplo, en el Schema.loadsmétodo Marshmallow framework devuelve un UnmarshalResultque es un namedtuple. Entonces puedes hacer:

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

o

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

En otros casos, puede devolver un dictde su función:

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

Pero es posible que desee considerar devolver una instancia de una clase de utilidad, que envuelve sus datos:

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
fuente
26

Me gustaría devolver dos valores de una función en dos variables separadas.

¿Cómo esperarías que se vea en el extremo de la llamada? No puedes escribira = select_choice(); b = select_choice() porque eso llamaría a la función dos veces.

Los valores no se devuelven "en variables"; así no es como funciona Python. Una función devuelve valores (objetos). Una variable es solo un nombre para un valor en un contexto dado. Cuando llama a una función y asigna el valor de retorno en alguna parte, lo que está haciendo es darle un nombre al valor recibido en el contexto de la llamada. La función no pone el valor "en una variable" para usted, la asignación sí (no importa que la variable no sea "almacenamiento" para el valor, sino nuevamente, solo un nombre).

Cuando traté de usar return i, card, devuelve un tupley esto no es lo que quiero.

En realidad, es exactamente lo que quieres. Todo lo que tienes que hacer es tuplevolver a desmontar.

Y quiero poder usar estos valores por separado.

Así que solo toma los valores de tuple .

La forma más fácil de hacerlo es desempacando:

a, b = select_choice()
Karl Knechtel
fuente
1
Gracias por explicar "por qué es como es". La mejor respuesta imo.
Edward Coelho
17

Creo que lo que quieres es una tupla. Si lo usa return (i, card), puede obtener estos dos resultados al:

i, card = select_choice()
heinrich5991
fuente
8
def test():
    ....
    return r1, r2, r3, ....

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

ahora puedes hacer todo lo que quieras con tu tupla.

Amin Jalali
fuente
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
usuario8541092
fuente
2

Y esta es una alternativa. Si regresa como lista, entonces es simple obtener los valores.

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

values = select_choice()

print values[0]
print values[1]
Praveen
fuente
2

puedes probar esto

class select_choice():
    return x, y

a, b = test()
samuel161
fuente
1

Puede devolver más de un valor utilizando la lista también. Revise el código a continuación

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
fuente