2012-05-29 2 views
24

Как уже упоминалось here, вы можете использовать звезду для распаковки неизвестное количество переменных (например, в функциях), но только в Python 3:Python звезды распаковка версии 2.7

>>> a, *b = (1, 2, 3) 
>>> b 
[2, 3] 
>>> a, *b = (1,) 
>>> b 
[] 

В Python 2.7, лучший Я могу придумать это (не страшно, но раздражает):

c = (1, 2, 3) 
a, b = c[0], c[1:] if len(c) > 1 else [] 

есть ли способ, чтобы импортировать это из __future__, как деление, или мне нужна моя собственная функция, чтобы сделать неизвестную длину распаковка в Python 2.7?

+4

Нет, это один из немногих Py3k * только * особенности. – JBernardo

+1

Это называется расширенной распаковкой –

ответ

25

в Python 2.x, вы можете сделать:

c = (1, 2, 3) 
a, b = c[0], c[1:] 

до тех пор, как c имеет, по меньшей мере, один элемент будет работать, потому что если c только 1 вещь в нем c[1:][] является.

Возможно, вы должны убедиться, что есть хотя бы одна вещь в c, иначе c[0] вызовет исключение.

Вы могли бы сделать что-то вроде:

try: 
    c = tuple(c) 
    a, b = c[0], c[1:] 
except TypeError, IndexError: 
    # c is not iterable, or c is iterable, but it doesn't have any stuff in it. 
    # do something else 
    pass 
+3

Только если 'c' - это последовательность. Распаковка работает с любым итерабельным, поэтому для полного решения сделайте 'c = tuple (c)' first. Это точно эмулирует поведение, включая зависание на бесконечных итерациях. Но вам все равно придется усердно работать для 'a, * b, c = range (10)'; но нет никакого реального пути вокруг этого. – lvc

+0

@lvc хороший пункт. Я отредактировал свой ответ. – Andbdrew

+2

@lvc man, что 'a, * b, c = range (10)' довольно круто! – Andbdrew

2
(a,b) = (None, []) if not len(c) else (c[0], c[1:]) 

также вариант для обработки случай где с пустой последовательностью, хотя он не будет различать [None] и [] в терминах как присвоения a, b. Поэтому используйте его с осторожностью, try/except, вероятно, лучше всего.

Я не вижу никакой реальной разницы между Python 3 и 2.7 при работе с пустым контейнером, но приятная вещь о Python 3 здесь работает с любым итерабельным.

Это работает в 2.7, если вы знаете, что c является генератором.

a,b = c.next(), c 

Но полная красота распаковке, кажется, требует Python 3.

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