понимание функции zip

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

Я уверен, что мне не хватает чего-то очень простого ..

14
задан max 5 October 2010 в 16:20
поделиться