← Назад к вопросам
Можно ли сделать бесконечный итератор в Python?
2.0 Middle🔥 171 комментариев
#Python Core
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# Бесконечные итераторы в Python
Да, в Python абсолютно возможно создать бесконечный итератор. Это полезный инструмент, когда нужно генерировать значения без предопределённого конца.
Способы создания бесконечных итераторов
1. Встроенный модуль itertools
Самый простой способ — использовать функции из модуля itertools:
import itertools
# count() — бесконечный счётчик
counter = itertools.count(1) # 1, 2, 3, 4, ...
for i in counter:
print(i)
if i > 5:
break
# cycle() — циклически повторяет элементы последовательности
cycler = itertools.cycle([1, 2, 3]) # 1, 2, 3, 1, 2, 3, ...
for i, val in enumerate(cycler):
print(val)
if i > 8:
break
# repeat() — бесконечно повторяет значение
repeater = itertools.repeat(42) # 42, 42, 42, ...
for i, val in enumerate(repeater):
print(val)
if i > 4:
break
2. Кастомный класс с методом __iter__ и __next__
Создавая собственный класс-итератор, полностью контролируешь поведение:
class InfiniteCounter:
def __init__(self, start=0):
self.current = start
def __iter__(self):
return self
def __next__(self):
value = self.current
self.current += 1
return value
counter = InfiniteCounter(10)
for i, val in enumerate(counter):
print(val)
if i > 5:
break # Выведет: 10, 11, 12, 13, 14, 15, 16
3. Генератор с while True
Это самый гибкий и популярный способ:
def infinite_numbers(start=0):
current = start
while True:
yield current
current += 1
gen = infinite_numbers(100)
for i, num in enumerate(gen):
print(num)
if i > 4:
break # Выведет: 100, 101, 102, 103, 104, 105
Генератор экономит память, так как вычисляет значения по требованию (lazy evaluation).
Практические примеры
Случайные числа до определённого условия
import random
def random_until_even():
while True:
num = random.randint(1, 100)
yield num
if num % 2 == 0:
break
for num in random_until_even():
print(num)
ID генератор для объектов
def generate_ids():
counter = 0
while True:
yield f'ID_{counter:05d}'
counter += 1
id_gen = generate_ids()
for _ in range(3):
print(next(id_gen)) # ID_00000, ID_00001, ID_00002
Fibonacci последовательность
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
fib = fibonacci()
for i, num in enumerate(fib):
print(num)
if i > 9:
break
Важные моменты
- StopIteration: Бесконечный итератор не должен выбрасывать
StopIteration(иначе он не бесконечный) - Контроль завершения: Всегда нужен внешний механизм остановки (break, условие в for)
- Память: Генераторы не хранят все значения, экономя ОЗУ
- Производительность: itertools оптимизирован на уровне C, быстрее своих реализаций
Бесконечные итераторы — мощный инструмент для работы с потоками данных, обработки событий и создания тестовых последовательностей.