while True
, который не имеет условия выхода, и оператор yield
для возврата значений.
Пример:
def infinite_generator():
while True:
yield "Значение"
Чтобы сделать генератор бесконечным в Python, нужно создать функцию-генератор, которая не имеет условия завершения. Это означает, что она никогда не достигнет оператора return
или не исчерпает итерируемый объект.
Вот несколько способов реализации:
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
# ...и так далее, бесконечно.
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 ограничит глубину рекурсии.
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)