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

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 intenté usar return i, card , devuelve una tuple y esto no es lo que quiero.

No puede devolver dos valores, pero puede devolver una tuple o una list y 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, card significa crear una tupla. También puede usar paréntesis como return (i, card) , pero las tuplas se crean con 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á que la persona que llama a la función acceda a los campos del valor devuelto por nombre, que es más legible. Todavía puede acceder a los elementos de la tupla por índice. Por ejemplo, en el método Schema.loads Marshmallow framework devuelve un UnmarshalResult que es un namedtuple . Así que 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 dict de 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) 

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

¿Cómo esperas que se vea en el extremo de la llamada? No puedes escribir a = select_choice(); b = select_choice() a = 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 algún lugar, 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, pero nuevamente, solo un nombre).

Cuando intenté usar return i, card , devuelve una tuple y esto no es lo que quiero.

En realidad, es exactamente lo que quieres. Todo lo que tienes que hacer es desarmar la tuple .

Y quiero poder usar estos valores por separado.

Así que solo toma los valores de la tuple .

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

 a, b = select_choice() 

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

 i, card = select_choice() 
 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.

 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 

Puede devolver más de un valor usando la lista también. Revisa el código de abajo

 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 

Y esta es una alternativa. Si regresa como una lista, es fácil obtener los valores.

 def select_choice(): ... return [i, card] values = select_choice() print values[0] print values[1]