Почему я не могу дважды выполнить итерацию по одному и тому же итератору? Как я могу «сбросить» итератор или повторно исPython

Программы на Python
Anonymous
Почему я не могу дважды выполнить итерацию по одному и тому же итератору? Как я могу «сбросить» итератор или повторно ис

Сообщение Anonymous »

Рассмотрим код:

Код: Выделить всё

def test(data):
for row in data:
print("first loop")
for row in data:
print("second loop")
Когда data является итератором, например итератором списка или выражением-генератором*, это не работает:

Код: Выделить всё

>>> test(iter([1, 2]))
first loop
first loop
>>> test((_ for _ in [1, 2]))
first loop
first loop
При этом первый цикл печатается несколько раз, поскольку данные не пусты. Однако он не печатает второй цикл. Почему перебор данных работает в первый раз, но не во второй? Как заставить его работать во второй раз?
За исключением циклов for, та же проблема возникает при любом виде итерации: list/set/ dict, передача итератора в list(), sum() или уменьшить() и т. д.
С другой стороны, если data — это другой тип итерации, например список или диапазон (оба являются последовательностями), оба цикла выполняются как положено:

Код: Выделить всё

>>> test([1, 2])
first loop
first loop
second loop
second loop
>>> test(range(2))
first loop
first loop
second loop
second loop
* Дополнительные примеры:
  • файловые объекты
  • генераторы, созданные на основе явной функции-генератора
  • Код: Выделить всё

    filterОбъекты 
    , Map и zip (в версии 3.x)
  • Код: Выделить всё

    enumerate
    объекты
  • Код: Выделить всё

    csv.reader
    s
  • различные итераторы, определенные в стандартной библиотеке itertools
Общую теорию и объяснение терминологии см. в разделе «Что такое итератор, итерируемый объект и итерация?».
Чтобы обнаружить< /em> является ли ввод итератором или «многоразовой» итерацией, см. в разделе «Гарантия возможности повторения аргумента дважды».

Подробнее здесь: https://stackoverflow.com/questions/253 ... e-iterator

Вернуться в «Python»