← Назад к вопросам

Можно ли сделать бесконечный итератор в 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, быстрее своих реализаций

Бесконечные итераторы — мощный инструмент для работы с потоками данных, обработки событий и создания тестовых последовательностей.