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