Код: Выделить всё
def test(data):
for row in data:
print("first loop")
for row in data:
print("second loop")
Код: Выделить всё
>>> 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
- файловые объекты
- генераторы, созданные на основе явной функции-генератора
- , Map и zip (в версии 3.x)
Код: Выделить всё
filterОбъекты
- объекты
Код: Выделить всё
enumerate
- s
Код: Выделить всё
csv.reader
- различные итераторы, определенные в стандартной библиотеке itertools
Чтобы обнаружить< /em> является ли ввод итератором или «многоразовой» итерацией, см. в разделе «Гарантия возможности повторения аргумента дважды».
Подробнее здесь: https://stackoverflow.com/questions/253 ... e-iterator