Все обсуждения посвящены python 3.1.2; см. Документы Python для источника моего вопроса.
Я знаю, что делает zip
; Я просто не понимаю, почему это можно реализовать следующим образом:
def zip(*iterables):
# zip('ABCD', 'xy') --> Ax By
iterables = map(iter, iterables)
while iterables:
yield tuple(map(next, iterables))
Скажем, я называю zip(c1, c2, c3)
. Если я правильно понял, итерации - это исходный код (c1, c2, c3).
Линия iterables = map(iter, iterables)
преобразует ее в итератор, который будет возвращать iter (c1), iter (c2), iter (c3), если он повторяется.
Внутри цикла map(next, iterables)
- это итератор, который возвратит next(iter(c1))
, next(iter(c2))
и next(iter(c3))
, если будет выполнено повторение. Вызов tuple
преобразует его в (next(iter(c1)), next(iter(c2)), next(iter(c3))
, исчерпывая его аргумент (iterables
) на самом первом вызове, насколько я могу судить. Я не понимаю, как цикл while
удается продолжить, если он проверяет iterables
; и если он продолжает, почему вызов tuple
не возвращает пустой кортеж (итератор исчерпан).
Я уверен, что мне не хватает чего-то очень простого.