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