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