Вот что до меня ну никак не доходит: есть код:
def myzip(*seqs):
seqs = [list(S) for S in seqs]
res = []
while all(seqs):
res.append(tuple(S.pop(0) for S in seqs))
return res
Он имитирует поведение фунции zip() в версии 3.0+. Вот эта строка ставит меня в тупик -res.append(tuple(S.pop(0) for S in seqs))
Добавить элемент в список res. Элемент является нулевым в списке s из списка списков seqs. Т.е. по-идее если функции передать последовательность [1,2,3],[3,2,1]
, то эта строка должна добавлять кортеж из одного элемента в список res. Но она работает иначе, почему?
.
1. Вместо
seqs = [list(S) for S in seqs] можно просто
seqs = list(seqs) .
Это превратит кортеж списков в список списков.
А можно пропустить эту строку, так-как этот-же перебор последовательности
seqs происходит далее внутри цикла.
2.Во время
res.append(tuple(S.pop(0) for S in seqs)) сначала из последовательности
seqs-ов выбираются поочереди каждый элемент,
указателем на который является
S ,
а из
S методом
S.pop(0) "выбивается" первый элемент .
Т.О.
S.pop(0) for S in seqs создает новую последовательность из всех первых элементов .
Метод
tuple(...) превращает новую последовательность в кортеж ,
а метод
res.append(...) добавляет полученный кортеж в конец списка
res .
Эти действия проиводятся в цикле пока не закончатся все
seqs-ы
while all(seqs): Примерно так .