2012-03-17 18 views
135

Chciałbym zwrócić dwie wartości z funkcji w dwóch oddzielnych zmiennych. Na przykład:Jak mogę zwrócić dwie wartości z funkcji w Pythonie?

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 

I chcę, aby móc korzystać z tych wartości oddzielnie. Kiedy próbowałem użyć return i, card, zwraca ona tuple i nie jest to tym, czego chcę.

+0

Proszę podać przykład nazywając tę ​​oczekiwaną funkcję i używając jego wartość (y) zwrotny, tak aby jasno dlaczego nie chcesz krotki. – bereal

+2

Jaki jest sens pętli while? –

+0

powinien mieć 'else: continue' przed zwrotnym oświadczeniem –

Odpowiedz

290

nie można powrócić dwie wartości, ale można zwrócić tuple lub list i rozpakować go po wywołaniu:

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

my_i, my_card = select_choice() 

Włączone linia return i, cardi, card oznacza utworzenie krotki. Możesz również użyć nawiasów takich jak return (i, card), ale krotki są tworzone przecinkami, więc parens nie są obowiązkowe. Ale możesz użyć parens, aby uczynić twój kod czytelniejszym lub podzielić krotkę na wiele linii. To samo dotyczy linii my_i, my_card = select_choice().

Jeśli chcesz zwrócić więcej niż dwie wartości, rozważ użycie named tuple. Pozwoli to wywołującemu funkcję na dostęp do pól zwracanej wartości przez nazwę, która jest bardziej czytelna. Nadal można uzyskać dostęp do elementów krotki według indeksu. Na przykład w Schema.loads metoda struktura Marshmallow zwraca UnmarshalResult, który jest namedtuple. Więc można zrobić:

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

lub

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

W innych przypadkach można zwrócić dict z funkcji:

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

ale warto rozważyć powrót instancję klasa użytkowa, która opakowuje dane:

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

Myślę, że to, czego chcesz, to krotka. Jeśli używasz return (i, card), można uzyskać te dwa wyniki według:

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

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

teraz możesz zrobić wszystko, co chcesz ze swoją krotką.

23

Chciałbym zwrócić dwie wartości z funkcji w dwóch oddzielnych zmiennych.

Czego można się spodziewać po zakończeniu połączenia? Nie można napisać a = select_choice(); b = select_choice(), ponieważ wywołałoby to funkcję dwa razy.

Wartości nie są zwracane "w zmiennych"; tak nie działa Python. Funkcja zwraca wartości (obiekty). Zmienna jest po prostu nazwą wartości w danym kontekście. Gdy wywołujesz funkcję i przypisujesz gdzieś wartość zwracaną, to co robisz, nadaje nazwie odebraną wartość w kontekście wywołania. Funkcja nie umieszcza dla ciebie wartości "w zmiennej", zadanie to (nieważne, że zmienna nie jest "pamięcią" dla wartości, ale znowu, tylko nazwą).

Kiedy próbowałem użyć return i, card, zwraca tuple i nie jest to, co chcę.

Właściwie to dokładnie to, czego chcesz. Wszystko, co musisz zrobić, to ponownie rozdzielić tuple.

I chcę móc korzystać z tych wartości osobno.

Po prostu pobierz wartości z tuple.

Najprostszym sposobem na to jest przez rozpakowaniu:

a, b = select_choice() 
+1

Dzięki za wyjaśnienie "dlaczego tak jest". Najlepsza odpowiedź imo. –

0

Można zwrócić więcej niż jedną wartość, używając listy również. Sprawdź poniższy kod:

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

Jest to alternatywa. Jeśli wracasz jako lista, łatwo jest uzyskać wartości.

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 
Powiązane problemy