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