Подтвердить что ты не робот

Распаковка звезды Python для версии 2.7

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

>>> 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?

4b9b3361

Ответ 1

в 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

Ответ 2

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

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

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

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

a,b = c.next(), c

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