Как вернуть два значения из функции в 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

И я хочу иметь возможность использовать эти значения отдельно. Когда я пытался использовать return i, card, он возвращает tuple, и это не то, что я хочу.

Ответ 1

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

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

my_i, my_card = select_choice()

В строке return i, card i, card означает создание кортежа. Вы также можете использовать скобки типа return (i, card), но кортежи создаются запятой, поэтому parens не являются обязательными. Но вы можете использовать parens, чтобы сделать ваш код более читаемым или разбить кортеж на несколько строк. То же самое относится к строке my_i, my_card = select_choice().

Если вы хотите вернуть более двух значений, подумайте об использовании named tuple. Это позволит вызывающей функции получить доступ к полям возвращаемого значения по имени, что более читаемо. Вы все равно можете получить доступ к элементам кортежа по индексу. Например, в методе Schema.loads структура Marshmallow возвращает UnmarshalResult, который является 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)

Ответ 2

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

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

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

Когда я попытался использовать return i, card, он возвращает tuple, и это не то, что я хочу.

Собственно, это именно то, что вы хотите. Все, что вам нужно сделать, это снова отделить tuple.

И я хочу иметь возможность использовать эти значения отдельно.

Итак, просто возьмите значения из tuple.

Самый простой способ сделать это - распаковать:

a, b = select_choice()

Ответ 3

Я думаю, что вы хотите, это кортеж. Если вы используете return (i, card), вы можете получить эти два результата:

i, card = select_choice()

Ответ 4

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

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

теперь вы можете делать все, что хотите, с помощью кортежа.

Ответ 5

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

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

Ответ 6

И это альтернатива. Если вы возвращаетесь как список, то просто получить значения.

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

values = select_choice()

print values[0]
print values[1]

Ответ 7

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