Jak mogę zwrócić dwie wartości z funkcji w Pythonie?

195

Chciałbym zwrócić dwie wartości z funkcji w dwóch osobnych zmiennych. Na przykład:

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ę móc używać tych wartości osobno. Kiedy próbowałem użyć return i, card, zwraca a, tuplea nie tego chcę.

Lycon
źródło
Podaj przykład wywołania tej oczekiwanej funkcji i wykorzystania jej wartości zwracanych, aby wyjaśnić, dlaczego nie chcesz krotek.
bereal,
2
Jaki jest sens pętli while?
Sven Marnach,
powinien mieć else: continuewyciąg przed zwrotem
maszyna tęskni
Tak, właśnie zauważyłem, że jest to duplikat stackoverflow.com/questions/38508/...
lpapp

Odpowiedzi:

399

Nie możesz zwrócić dwóch wartości, ale możesz zwrócić a tuplelub a listi rozpakować je po wywołaniu:

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

my_i, my_card = select_choice()

On line return i, card i, cardoznacza utworzenie krotki. Możesz także użyć nawiasu return (i, card), ale krotki są tworzone przecinkiem, więc pareny nie są obowiązkowe. Możesz jednak użyć parens, aby uczynić kod bardziej czytelnym lub podzielić krotkę na wiele wierszy. To samo dotyczy linii my_i, my_card = select_choice().

Jeśli chcesz zwrócić więcej niż dwie wartości, rozważ użycie nazwanej krotki . Umożliwi to wywołującemu funkcję dostęp do pól zwracanej wartości według nazwy, co jest bardziej czytelne. Nadal możesz uzyskać dostęp do elementów krotki według indeksu. Na przykład w Schema.loadsmetodzie platforma Marshmallow zwraca a, UnmarshalResultktóre jest a namedtuple. Możesz więc 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żesz zwrócić a dictze swojej funkcji:

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

Ale możesz rozważyć zwrócenie instancji klasy narzędzia, która otacza twoje 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)
warvariuc
źródło
27

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

Jak byś się spodziewał, że będzie wyglądał na końcu połączenia? Nie możesz pisać, a = select_choice(); b = select_choice()ponieważ wywołałoby to funkcję dwukrotnie.

Wartości nie są zwracane „w zmiennych”; nie tak działa Python. Funkcja zwraca wartości (obiekty). Zmienna to tylko nazwa wartości w danym kontekście. Kiedy wywołujesz funkcję i przypisujesz gdzieś wartość zwracaną, to nadając otrzymanej wartości nazwę w kontekście wywołującym. Funkcja nie umieszcza dla ciebie wartości „w zmiennej”, przypisanie tak robi (nieważne, że zmienna nie jest „pamięcią” dla wartości, ale tylko nazwą).

Kiedy próbowałem użyć return i, card, zwraca a, tuplea nie tego chcę.

Właściwie to jest dokładnie to, czego chcesz. Wszystko, co musisz zrobić, to tupleponownie rozebrać.

I chcę móc używać tych wartości osobno.

Więc po prostu pobierz wartości z tuple.

Najłatwiej to zrobić poprzez rozpakowanie:

a, b = select_choice()
Karl Knechtel
źródło
1
Dziękujemy za wyjaśnienie „dlaczego tak jest”. Najlepsza odpowiedź imo.
Edward Coelho,
17

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

i, card = select_choice()
heinrich5991
źródło
8
def test():
    ....
    return r1, r2, r3, ....

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

teraz możesz robić wszystko, co chcesz za pomocą krotki.

Amin Jalali
źródło
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
użytkownik8541092
źródło
2

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]
praveen
źródło
2

możesz tego spróbować

class select_choice():
    return x, y

a, b = test()
samuel161
źródło
1

Możesz także zwrócić więcej niż jedną wartość za pomocą listy. Sprawdź kod poniżej

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
źródło