2014-12-03 5 views
3

Я знаю, что функция может возвращать несколько значений в Python. То, что я хотел бы сделать, - вернуть каждый элемент в списке как отдельное возвращаемое значение. Это может быть произвольное количество элементов, в зависимости от ввода пользователя. Мне интересно, есть ли питонический способ сделать это?Возврат каждого элемента из списка (Python)

Например, у меня есть функция, которая вернет пару элементов в виде массива, например, вернет [a, b].

Однако, в зависимости от введенного ввода, функция может вызывать несколько пар, что приведет к возврату функции [[a, b], [c, d], [e, f]]. Вместо этого я бы хотел, чтобы он вернулся [a, b], [c, d], [e, f]

На данный момент я реализовал очень дрянную функцию с большим количеством временных переменных и подсчетов, и я ищу более чистое предложение.

Цените помощь!

+1

Не совсем верно сказать, что функции python могут возвращать более одного значения: такие функции фактически возвращают кортеж, который распаковывается при назначении. Таким образом, вы можете просто преобразовать свой список в кортеж, используя 'tuple()'. Если вы имеете в виду, что вы хотите вернуть их по одному разу при нескольких вызовах, тогда вы используете 'yield' и создаете генератор, что-то еще. –

+1

Стоит отметить, что кортежи - это только норма, когда дело доходит до «возвращения нескольких значений». Вы можете с радостью вернуть список и распаковать его точно так же, как кортеж. –

ответ

4

Существует инструкция yield, которая идеально подходит для этой утилиты.

def foo(a): 
    for b in a: 
     yield b 

Это вернет генератор, который вы можете повторить.

print [b for b in foo([[a, b], [c, d], [e, f]]) 
+0

Не то, что он спросил, но, вероятно, того, чего он действительно хочет. –

+0

@LeeDanielCrocker КПП. она она. :) – wenzul

0

Проверить этот вопрос: How to return multiple values from *args?

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

0

Однако, в зависимости от введенного ввода, функция может вызывать несколько пар, что приведет к возврату функции [[a, b], [c, d], [e, f]]. Вместо этого я хотел бы, чтобы он возвращался [a, b], [c, d], [e, f]

Можете ли вы не просто использовать возвращенный список (то есть список [[a, b], [c, d], [e, f]]) и извлечь из него элементы? Кажется, соответствует вашим критериям произвольного числа/нескольких значений.

+0

Вы можете просто использовать 'tuple()' для преобразования списка в кортеж. Многозначные функции Python фактически возвращают кортеж, который автоматически распаковывается при назначении. –

+0

Я закончил тем, что делал что-то подобное, основанное на функциональности метода вызывающего. Но предложение @wenzul скорее всего более питоновское, и я могу переписать его, чтобы использовать более сжатую «доходность». Спасибо, парни! – luisamaria

2

Когда функция питона выполняет:

return a, b, c 

, что он на самом деле возвращает это кортеж (a, b, c) и кортежи распакованы на уступки, так что вы можете сказать:

x, y, z = f() 

и все хорошо. Так что если у вас есть список

mylist = [4, "g", [1, 7], 9] 

Ваша функция может просто:

return tuple(mylist) 

и ведут себя, как вы ожидаете:

num1, str1, lst1, num2 = f() 

будет делать задания, как вы ожидаете.

Если то, что вы действительно хотите для функции, чтобы вернуть неопределенное число вещей как последовательности, которые можно перебирать не, то вы хотите, чтобы сделать его генератор, используя yield, но это другой шар воск.

Смежные вопросы