2009-12-12 3 views
1

У меня есть функция, которая возвращает список. Когда я знаю, что количество элементов в списке, я могу сделать что-то вроде:возвращает переменные выходы в функции Python?

x,y,z=foo() 

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

x,y*=foo() 

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

благодарит заранее.

ответ

3

Немного обобщенный подход:

>>> def unpack(seq, count): 
... return seq[:count] + [seq[count:]] 
>>> a, b = unpack([1, 2, 3], 1) 
>>> a 
1 
>>> b 
[2, 3] 
>>> a, b = unpack([1, 2], 1) 
>>> a 
1 
>>> b 
[2] 
>>> a, b = unpack([1], 1) 
>>> a 
1 
>>> b 
[] 
>>> a, b = unpack([], 1) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: need more than 1 value to unpack 
>>> a, b, c, d = unpack(range(10), 3) 
>>> a 
0 
>>> b 
1 
>>> c 
2 
>>> d 
[3, 4, 5, 6, 7, 8, 9] 
+0

есть способ каким-то образом выяснить, какое количество желаемых выходов вместо подачи его в качестве входа в функцию распаковки? – reckoner

+0

Без серьезных осложнений нет. Вам нужно будет проверить байт-код вызывающего абонента, который был бы неплохо пройденный здравый смысл. Воспроизведение ссылки, которую вы указали выше, в другом комментарии (где кто-то делает именно это): http://code.activestate.com/recipes/284742/. Выполнение чего-то подобного похоже на использование макросов в C для определения новых языковых конструкций: очень плохая идея. Лучше жить с несколькими бородавками на выбранном вами языке, чем составлять язык только с одним программистом в мире, который знает, что это значит. –

3

Как это

results = foo() 
x= results[0] 
y= results[1:] 

Или изменить функцию, чтобы вернуться в две-кортеже

def foo(): 
    .... 
    return someList[0], someList[1:] 
+0

это подход принимается в более общем виде: Рецепт 284742: Определение количества значений, которые вызывающий абонент ожидает http://code.activestate.com/recipes/284742 – reckoner

16

Там нет философских возражений против вашего синтаксиса, на самом деле, он поддерживается в Python 3.1:

>>> a, *b = range(10) 
>>> a 
0 
>>> b 
[1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> # Or even more flexibly: 
>>> a, *b, c = range(10) 
>>> a 
0 
>>> b 
[1, 2, 3, 4, 5, 6, 7, 8] 
>>> c 
9 
>>> 
+0

Поддерживается ли этот синтаксис в Python 2.6? – reckoner

+2

№ ------- 15char ------- –

0

Что вам нужно сделать, это вернуть список

например return [...]

После этого вы получите список и найдите его длину, например. а = F (.....)

Len (ABC) даст вам количество элементов в списке

для iiabc в а: позволит вам получить доступ к каждому из элементов

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