Все обсуждения посвящены 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 не возвращает пустой кортеж (итератор исчерпан).
Я уверен, что мне не хватает чего-то очень простого.