Почему я не могу дважды выполнить итерацию по одному и тому же итератору? Как я могу «сбросить» итератор или повторно ис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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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