itertools.cycle ()
Один из способов сделать это - использовать itertools.cycle()
, который будет по существу хранить результаты генератора, а затем непрерывно зацикливать их снова и снова. Документы
Если вы решите это сделать, вы будете использовать много дополнительной памяти для хранения этих результатов.1014 * В качестве альтернативного метода, вы можете try:
и except StopIteration
для вашего генератора, чтобы сбросить его обратно в начало.Генераторы всегда вызывают StopIteration, если вы вызываете __next__
на исчерпанном генераторе.
Редактировать: Первоначально я связался с функцией-оболочкой здесь , но код в этом примере фактически не работает.Ниже приведен код, который я протестировал для работы, который, надеюсь, будет полезен.Мой ответ здесь основан на той же концепции.
def Primes(max): # primary generator
number = 1
while number < max:
number += 1
if check_prime(number):
yield number
primes = Primes(100)
def primer(): # this acts as a loop and resets your generator
global primes
try:
ok = next(primes)
return ok
except StopIteration:
primes = Primes(100)
ok = next(primes)
return ok
while True: # this is the actual loop continuing forever
primer()
Вы заметите, что мы не могли неявно ссылаться на нашу собственную функцию для сброса себя, и мы также не могли использовать стандарт for loop
потому что он всегда будет ловить StopIteration
, прежде чем вы сможете, по проекту [подробнее] .