Это катастрофа! Вы создаете итератор для возврата простых чисел, но внутренне вы используете тот же итератор для генерации простых делителей и проверки, является ли число простым. По сути, исчерпывает итератор, поскольку он пытается найти возвращаемое значение. Или что-то типа того. Вместо этого нам нужно создать новый экземпляр этого итератора (с меньшим пределом) для генерации простых делителей. (Т.е. рекурсия.) Что-то вроде:
class PrimeList:
def __init__(self, limit):
self.limit = limit
self.value = 2
def __iter__(self):
return self
def is_prime(self, x):
while True:
try:
y = next(self)
if x % y == 0:
return False
except StopIteration:
return True
def __next__(self):
while self.value < self.limit:
divisors = PrimeList(int(self.value ** 0.5) + 1) # recursion
found = divisors.is_prime(self.value)
self.value += 1
if found:
return self.value - 1
raise StopIteration()
test = PrimeList(100)
print(*test, sep=", ")
Это работает, но должно быть на медленной стороне:
% python3 test.py
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97
%
Классная проблема!