Метод цикла Itertools - почему цикл "while"? - PullRequest
0 голосов
/ 03 декабря 2018

Изучая детали реализации itertools.cycle, мне показалось, что цикл while использовался для сброса генератора (функция с выходом) и обеспечения бесконечного повторения итерируемого, но если бы это было так, в то время как нетпереместитесь вверх и удалите вторую половину метода.Предполагая, что они умнее меня, я предполагаю, что мне чего-то не хватает, хотя вторая функция, приведенная ниже, похоже, работает с заданными диктами, списками и строками.

https://docs.python.org/3.7/library/itertools.html#itertools.cycle

def cycle(iterable):
    # cycle('ABCD') --> A B C D A B C D A B C D ...
    saved = []
    for element in iterable:
        yield element
        saved.append(element)
    while saved:
        for element in saved:
              yield element

против

def cycle_huh(iterable):
    # cycle('ABCD') --> A B C D A B C D A B C D ...
    while True:
        for element in iterable:
            yield element

Я что-то упускаю?Или итеративный тип, где требуется первое, а второе его сломает.

1 Ответ

0 голосов
/ 03 декабря 2018

Если iterable является генератором или другим надлежащим итератором (а не, скажем, списком), то он будет исчерпан при первом проходе цикла for element in iterable, а последующие проходы в этом цикле ничего не дадут.Вам нужно сохранить содержимое итерируемого где-то во время итерации в первый раз, чтобы избежать этого.

...