Як я можу повернути два значення з функції в Python?


195

Я хотів би повернути два значення з функції у двох окремих змінних. Наприклад:

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

І я хочу мати можливість використовувати ці значення окремо. Коли я намагався використовувати return i, card, він повертає a, tupleі це не те, що я хочу.


Наведіть приклад виклику цієї очікуваної функції та використання її зворотних значень, щоб було зрозуміло, чому ви не хочете кортежів.
bereal

2
Який сенс циклу while?
Свен Марнах

повинні мати else: continueперед повідомленнями про повернення
машинне тяжіння


Так, я тільки що помітив , що це дублікат stackoverflow.com/questions/38508 / ...
lpapp

Відповіді:


399

Ви не можете повернути два значення, але ви можете повернути a tupleабо a listі розпакувати його після виклику:

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

my_i, my_card = select_choice()

На лінії return i, card i, cardозначає створення кортежу. Ви також можете використовувати дужки типу return (i, card), але кортежі створюються комою, тому паролі не є обов'язковими. Але ви можете використовувати парени, щоб зробити ваш код більш читабельним або розділити кортеж на кілька рядків. Те саме стосується лінії my_i, my_card = select_choice().

Якщо ви хочете повернути більше двох значень, спробуйте використати названий кортеж . Це дозволить абоненту функції отримати доступ до полів поверненого значення за назвою, що є більш читабельним. Ви все одно можете отримати доступ до елементів кортежу за індексом. Наприклад, у Schema.loadsметоді Marshmallow Framework повертає a, UnmarshalResultщо є a namedtuple. Тож ви можете зробити:

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

або

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

В інших випадках ви можете повернути dictсвою функцію:

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

Але ви, можливо, захочете повернути екземпляр класу утиліти, який обробляє ваші дані:

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)

27

Я хотів би повернути два значення з функції у двох окремих змінних.

Як би ви очікували, що це буде виглядати на виклику? Ви не можете писати, a = select_choice(); b = select_choice()тому що це викликало би функцію двічі.

Значення не повертаються "в змінних"; так не працює Python. Функція повертає значення (об'єкти). Змінна - це лише назва для значення в заданому контексті. Коли ви викликаєте функцію і присвоюєте десь повернене значення, те, що ви робите, - давати отриманому значенню ім'я в контексті виклику. Функція не ставить для вас значення "в змінну", це присвоєння (не майте на увазі, що змінна не є "зберіганням" для значення, але, знову ж таки, лише ім'я).

Коли я намагався використовувати return i, card, він повертає a, tupleі це не те, що я хочу.

Власне, це саме те, що ти хочеш. Все, що вам потрібно зробити - це tupleзнову розлучитися.

І я хочу мати можливість використовувати ці значення окремо.

Тому просто захопіть значення з tuple.

Найпростіший спосіб зробити це, розпакувавши:

a, b = select_choice()

1
Дякуємо, що пояснили, "чому це так є". Найкраща відповідь imo.
Едвард Коельо

17

Я думаю, що ти хочеш - кортеж. Якщо ви користуєтесь return (i, card), ви можете отримати ці два результати:

i, card = select_choice()

8
def test():
    ....
    return r1, r2, r3, ....

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

тепер ви можете робити все, що завгодно, зі своїм кортежем.



2

І це альтернатива. Якщо ви повертаєтесь як список, то значення отримати просто.

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

values = select_choice()

print values[0]
print values[1]

2

ви можете спробувати це

class select_choice():
    return x, y

a, b = test()

1

Ви також можете повернути більше одного значення, використовуючи список. Перевірте код нижче

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.