Итератор простых чисел - PullRequest
       5

Итератор простых чисел

0 голосов
/ 24 сентября 2011

Я написал кусок кода для печати n простых чисел:

class PrimeGen:
    def __init__(self):
        self.current = 2
    def genPrime(self, num):
        for i in range(num):
            while 1:
                for j in range(2, self.current/2 + 1):
                    if self.current % j == 0:
                        self.current = self.current + 1
                        break
                else:
                    break
            print self.current,
            self.current = self.current + 1

if __name__ == '__main__':
    p = PrimeGen()
    p.genPrime(5)

Код работает нормально.Я получаю 2 3 5 7 11 в качестве вывода.Я пытался сделать класс iterable.Код ниже.Но на выходе получается 0 1 2 3 4.Я не мог понять, где я иду не так.Любая помощь приветствуется.Спасибо

class PrimeIter:
    def __init__(self):
        self.current = 1

    def next(self):
        self.current = self.current + 1
        while 1:
            for i in range(2, self.current/2 + 1):
                if self.current % i == 0:
                    self.current = self.current + 1
                    break # Break current for loop
            else:
                break # Break the while loop and return
        return self.current

    def __iter__(self):
        return self

if __name__ == '__main__':
    p = PrimeIter()
    for p in range (5):
        print p,

Ответы [ 2 ]

3 голосов
/ 24 сентября 2011

Вы используете этот код для распечатки значений:

for p in range (5):
    print p,

Если вы посмотрите на это, он печатает значения диапазона.Вы, вероятно, хотите напечатать вещи из основного итератора.itertools имеет несколько функций, которые могут помочь:

for prime in itertools.islice(p, 5):
    print prime,

Кроме того, вы можете рассмотреть возможность использования генератора:

def primes():
    current = 1
    while True:
        current += 1
        while True:
            for i in xrange(2, current // 2 + 1):
                if current % i == 0:
                    current += 1
                    break
            else:
                break
        yield current
1 голос
/ 24 сентября 2011

Ваша проблема в том, что вы повторно используете переменную p в тестовом коде:

if __name__ == '__main__':
    p = PrimeIter() # first declaration of p
    for p in range (5): # second declaration of p
        print p,   # uses second declaration of p

Я бы порекомендовал использовать itertools.islice, чтобы получить первые 5 элементов итератора:

if __name__ == '__main__':
    p = PrimeIter()
    for x in itertools.islice(p, 5):
        print x,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...