Как можно сделать генератор бесконечным?

Генератор можно сделать бесконечным, используя цикл while True, который не имеет условия выхода, и оператор yield для возврата значений. Пример:

def infinite_generator():
  while True:
    yield "Значение"
  

Чтобы сделать генератор бесконечным в Python, нужно создать функцию-генератор, которая не имеет условия завершения. Это означает, что она никогда не достигнет оператора return или не исчерпает итерируемый объект.

Вот несколько способов реализации:

  1. Использование while True: Самый простой и распространенный способ. Цикл while True будет выполняться бесконечно, генерируя значения при каждом вызове yield.
    def infinite_generator():
      i = 0
      while True:
        yield i
        i += 1
    
    # Пример использования:
    gen = infinite_generator()
    print(next(gen))  # Output: 0
    print(next(gen))  # Output: 1
    print(next(gen))  # Output: 2
    # ...и так далее, бесконечно.
    
  2. Рекурсивный генератор: Можно использовать рекурсию, чтобы вызвать генератор внутри самого себя. Это менее распространено, но показывает понимание работы генераторов. Внимание: необходимо ограничить рекурсию, иначе может произойти переполнение стека, если не будет явно остановлено внешним кодом!
    def infinite_recursive_generator():
      yield 0
      yield from infinite_recursive_generator() # yield from делегирует итерацию
    
    # Пример использования (не практичный из-за ограничений рекурсии):
    # gen = infinite_recursive_generator()
    # print(next(gen)) # 0
    # print(next(gen)) # 0
    # print(next(gen)) # 0
    # ...и так далее (в теории).  На практике Python ограничит глубину рекурсии.
    
  3. Использование itertools.cycle: Если нужно зациклить существующую последовательность, можно использовать itertools.cycle. Этот метод создаст бесконечный генератор, который будет повторять элементы из предоставленной последовательности.
    import itertools
    
    def infinite_cycle_generator(data):
      yield from itertools.cycle(data)
    
    # Пример использования:
    gen = infinite_cycle_generator([1, 2, 3])
    print(next(gen))  # Output: 1
    print(next(gen))  # Output: 2
    print(next(gen))  # Output: 3
    print(next(gen))  # Output: 1
    print(next(gen))  # Output: 2
    # ...и так далее, бесконечно.
    

Важно помнить: Бесконечные генераторы нужно использовать осторожно. Если не ограничить их использование, например, путем взятия только определенного количества элементов (с помощью itertools.islice или подобным способом), это может привести к бесконечному циклу и зависанию программы. Пример безопасного использования:

import itertools

def limited_infinite_generator(n):
  i = 0
  while True:
    yield i
    i += 1

gen = limited_infinite_generator(10)
for i in itertools.islice(gen, 5): # берем только первые 5 элементов
  print(i)
0