Примеры из учебника нескольких распаковывающих присвоение являются чем-то как:
import numpy as NP
M = NP.arange(5)
a, b, c, d, e = M
# so of course, a = 0, b = 1, etc.
M = NP.arange(20).reshape(5, 4) # numpy 5x4 array
a, b, c, d, e = M
# here, a = M[0,:], b = M[1,:], etc. (ie, a single row of M is assigned each to a through e)
(Мой вопрос не numpy
конкретный. Действительно, я предпочел бы чистое решение Python.)
Для части кода я смотрю на теперь, я вижу две сложности на том простом сценарии:
Я обычно не буду знать форму M; и
Я хочу распаковать определенное число объектов (определенно меньше, чем все объекты), и я хочу поместить остаток в единственный контейнер
Таким образом, назад к 5x4 выстраивают выше, что я очень хотел бы сделать, присваивают первые три строки M к a, b, и c соответственно (точно как выше), и остальная часть строк (я понятия не имею, сколькими будет, просто некоторое положительное целое число) к единственному контейнеру, all_the_rest = []
.
Python 3.x может сделать это легко:
a, b, *c = someseq
Python 2.x требует немного больше работы:
(a, b), c = someseq[:2], someseq[2:]
Синтаксис для этого добавлен в Python 3
>>> # Python 3.x only
>>> a, b, *c = range(10)
>>> a
0
>>> b
1
>>> c
[2, 3, 4, 5, 6, 7, 8, 9]
, но аналогичного решения не существует в Python 2.
Вы, конечно, можете использовать
>>> s = range(10)
>>> s
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> (a, b, c), rest = s[0:3], s[3:]
>>> a
0
>>> b
1
>>> c
2
>>> rest
[3, 4, 5, 6, 7, 8, 9]
или другие подобные решения.