Бесконечные итераторы в Python itertools.count(), cycle(), repeat()

Опубликован: 29.02.2024 87

В Python функции itertools.count(), itertools.cycle() и itertools.repeat() встроенного модуля itertools могут использоваться для создания бесконечных итераторов.

Бесконечные итераторы никогда не завершаются сами, поэтому важно использовать эти функции с осторожностью из-за их способности создавать бесконечные циклы и обязательно предусматривать механизм прерывания цикла.

Эти функции очень полезны для решения задач, в которых количество итераций заранее неизвестно или бесконечно.

Функция itertools.count().

Функция itertools.count() создает бесконечный итератор, возвращающий числа, начиная со start с шагом step. Эта функция очень похожа на range(), только бесконечный.

Синтаксис: itertools.count(start=0, step=1)

  • start - начальное значение (по умолчанию 0);
  • step - шаг итератора (по умолчанию 1).
import itertools

for i in itertools.count():
    print(i, end=" ")
    if i >= 10: break
0 1 2 3 4 5 6 7 8 9 10 

# step может быть и отрицательным
for i in itertools.count(10, -1):
    print(i, end=" ")
    if i<=0: break
10 9 8 7 6 5 4 3 2 1 0

# в комбинации с zip() можно создать кортеж, включая counter
list_1 = ['a', 'b', 'c']
list_2 = ['x', 'y', 'z']

print(list(zip(itertools.count(), list_1, list_2)))
[(0, 'a', 'x'), (1, 'b', 'y'), (2, 'c', 'z')]

Функция itertools.cycle().

Функция itertools.cycle() создает бесконечный итератор, возвращающий элементы из исходного итератора iterable и сохраняющий их копии, а при исчерпании iterable, начинает возвращать копии.

Важно помнить, что itertools.cycle() хранит копию итерируемого объекта в памяти, что может привести к переполнению памяти при работе с большими данными.

Синтаксис: itertools.cycle(iterable)

import itertools

for i, item in enumerate(itertools.cycle('ABCD')):
    if i > 10: break
    print(item, end=" ")
A B C D A B C D A B C

# использование cycle() в комбинации с zip()
list_1 = [1, 10, 100]
list_2 = [0, 1, 2, 3, 4, 5, 6]

print(list(zip(itertools.cycle(list_1), list_2)))
[(1, 0), (10, 1), (100, 2), (1, 3), (10, 4), (100, 5), (1, 6)]

Функция itertools.repeat().

Функция itertools.repeat() создает бесконечный итератор, который будет возвращать переданный объект object бесконечно или times раз.

Синтаксис: itertools.repeat(object [, times])

  • object - объект, возвращаемый итератором (словарь, список, строка и т.д. );
  • times - аргумент (не обязательный), ограничивающий количество итераций (повторений) переданного объекта object.
import itertools

list_1 = [1, 2, 3, 4, 5]
for lst in itertools.repeat(list_1, 3):
    print(lst)
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]

# использование repeat() в комбинации с zip()
list_1 = [0, 1, 2, 3]
print(list(zip(itertools.repeat(10), list_1)))
[(10, 0), (10, 1), (10, 2), (10, 3)]

Похожие посты

Фильтрация элементов итератора с помощью bool-списка функции itertools.compress()

Пропуск не нужных элементов последовательности с помощью itertools.dropwhile()

Возвращение элементов списка пока условие истинно с помощью itertools.takewhile()

Создание срезов из итератора с использованием itertools.islice()

Комментариев нет.