Создание итератора простых чисел

Нужно реализовать класс PrimesIterator, позволяющий итерироваться по простым числам, начиная с заданного. Примеры использования:

for n in PrimesIterator(42): print(n)

for n in PrimesIterator(): print(n)

Что не так с моим кодом?

from math import sqrt
from itertools import count, islice

def is_prime(n):
    return n > 1 and all(n % i for i in islice(count(2), int(sqrt(n) - 1)))

class PrimesIterator:
    def __init__(self, start=0):
        self.start = start

    def __iter__(self):
        return self

    def __next__(self):
        self.start += 1

        if is_prime(self.start):
            return self.start
        else:
            return self.__next__()

ЯндексКонтест:

test_primes_iterator (__main__.SampleTestSuite) ... FAIL

======================================================================
FAIL: test_primes_iterator (__main__.SampleTestSuite)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "run_tests.py", line 34, in test_primes_iterator
    self.assertEqual(nums, expected_nums)
AssertionError: Lists differ: [1009, 1013, 1019, 1021, 1031, 1033, 1039,[553 chars]1721] != [997, 1009, 1013, 1019, 1021, 1031, 1033, [552 chars]1709]

First differing element 0:
1009
997

Diff is 956 characters long. Set self.maxDiff to None to see it.

----------------------------------------------------------------------
Ran 1 test in 0.004s

FAILED (failures=1)

0.0

Ответы (2 шт):

Автор решения: Dylan Vergara
def __next__(self):
    temp = self.start
    self.start += 1  #if u dont do that, the number wich u will start is the next of that u want

    if is_prime(temp):
        return temp
    else:
        return self.__next__()
→ Ссылка
Автор решения: CrazyElf

Судя по всему, нужно переделать код так, чтобы в случае, если переданное при инициализации число уже простое, оно тоже попало в выдачу. Ну и рекурсию я убрал, в питоне рекурсия не бесконечная, плюс к тому она забивает стек лишними данными, обычно всегда можно обойтись без рекурсии:

    def __next__(self):
        # ищем простое число, начиная с текущего
        while not is_prime(self.start):
            self.start += 1
        # запомним его, чтобы вернуть
        ret = self.start
        # увеличим, чтобы дальше искать следующее
        self.start += 1
        # возвращаем запомненное
        return ret
→ Ссылка