Опубликован: 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()
Комментариев нет.