Распаковка звезды 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?
Ответы
Ответ 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.