2012-03-17 23 views
135

Me gustaría devolver dos valores de una función en dos variables separadas. Por ejemplo:¿Cómo puedo devolver dos valores de una función en Python?

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 ser capaz de utilizar estos valores por separado. Cuando traté de usar return i, card, devuelve un tuple y esto no es lo que quiero.

+0

Sírvanse proporcionar un ejemplo de llamar a esta función esperada y el uso de su valor (s) de retorno, por lo que deja claro por qué no desea tuplas. – bereal

+2

¿Cuál es el punto del ciclo while? –

+0

debería tener un 'else: continue' antes de las declaraciones de devolución –

Respuesta

290

No se puede devolver dos valores, pero se puede devolver un 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, cardi, card significa crear una tupla. También puede usar paréntesis como return (i, card), pero las tuplas se crean mediante una coma, 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 múltiples 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 un named tuple. Permitirá que la persona que llama de 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. Por lo que puede 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, es posible 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 la posibilidad de devolver una instancia de una clase de utilidad, que ajusta 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) 
15

Creo que lo que quiere es una tupla. Si utiliza return (i, card), puede obtener estos dos resultados por:

i, card = select_choice() 
7
def test(): 
    .... 
    return r1, r2, r3, .... 

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

ahora puede hacer todo lo que quiera con su tupla.

23

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

¿Cómo se vería en el extremo de la llamada? No puede escribir 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 alguna parte, lo que hace 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 tarea lo hace (no importa que la variable no sea "almacenamiento" para el valor, sino que nuevamente, solo un nombre).

cuando traté de utilizar return i, card, devuelve un tuple y esto no es lo que quiero.

En realidad, es exactamente lo que quiere. Todo lo que tienes que hacer es volver a separar el tuple.

Y deseo poder utilizar estos valores por separado.

Así que solo tome los valores del tuple.

La forma más sencilla de hacer esto es mediante el desembalaje:

a, b = select_choice() 
+1

Gracias por explicar "por qué es así". Mejor respuesta imo. –

0

Usted puede devolver más de un valor utilizando la lista también. Compruebe 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 
1

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] 
0
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 
Cuestiones relacionadas