Как я могу вернуть два значения из функции в 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 и это не то, чего я хочу.

7 ответов


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

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

my_i, my_card = select_choice()

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

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

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

как бы вы ожидали, что это будет выглядеть на конце вызова? Ты не можешь писать!--1--> потому что это вызовет функцию дважды.

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

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

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

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

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

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

a, b = select_choice()

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

i, card = select_choice()

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

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

теперь вы можете делать все, что вам нравится с кортежем.


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

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

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

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

values = select_choice()

print values[0]
print values[1]

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