Создать класс итерируемых объектов, который выдает последовательность простых чисел до n
Задача: Есть функция генерации списка простых чисел
def get_prime_numbers(n):
prime_numbers = []
for number in range(2, n + 1):
for prime in prime_numbers:
if number % prime == 0:
break
else:
prime_numbers.append(number)
return prime_numbers
На основе алгоритма get_prime_numbers создать класс итерируемых объектов, который выдает последовательность простых чисел до n Распечатать все простые числа до n в столбик
Мой вариант:
class PrimeNumbers:
def __init__(self, n):
self.prime_numbers = []
self.n = n
self.i = 0
def __iter__(self):
self.i = 1
return self
def __next__(self):
self.i += 1
if self.i < self.n:
for prime in self.prime_numbers:
if self.i % prime == 0:
break
else:
self.prime_numbers.append(self.i)
return self.i
else:
raise StopIteration()
prime_number_iterator = PrimeNumbers(n=10)
for number in prime_number_iterator:
print(number)
Проблема в том, что из-за оператора break неподходящие числа выводятся как None:
2
3
None
5
None
7
None
None
None
Подскажите, пожалуйста, как это можно исправить не меняя условия задачи, т.е. используя данный алгоритм поиска простых чисел? Очевидно, что каждая итерация должна выдавать строго простое число.. Т.о. каждое следующее число не будет равно номеру итерации. Тогда может следует вынести функцию определения простого числа в отдельный метод?
Ответы (3 шт):
class PrimeNumbers:
def __init__(self, n):
self.prime_numbers = []
self.n = n
self.i = 0
def __iter__(self):
self.i = 1
return self
def _get_next_prime_or_none(self):
self.i += 1
for prime in self.prime_numbers:
if self.i % prime == 0:
return None
self.prime_numbers.append(self.i)
return self.i
def __next__(self):
value = None
while value is None:
value = self._get_next_prime_or_none()
if self.i < self.n:
return value
else:
raise StopIteration()
prime_number_iterator = PrimeNumbers(n=10)
for number in prime_number_iterator:
print(number)
Окончательный вариант:
class PrimeNumbers:
def __init__(self, n):
self.prime_numbers = []
self.n = n
self.i = 0
def __iter__(self):
self.i = 1
return self
def get_prime_numbers(self):
self.i += 1
for prime in self.prime_numbers:
if self.i % prime == 0:
return False
return True
def __next__(self):
while self.i < self.n:
if self.get_prime_numbers():
self.prime_numbers.append(self.i)
return self.i
else:
raise StopIteration()
prime_number_iterator = PrimeNumbers(n=1000)
for number in prime_number_iterator:
print(number)
class PrimeNumbers:
def __init__(self, n):
self.n = n
def __iter__(self):
self.i = 2
self.prime_numbers = []
return self
def __next__(self):
while self.i <= self.n:
for prime in self.prime_numbers:
if self.i % prime == 0:
break
else:
self.prime_numbers.append(self.i)
return self.i
self.i += 1
else:
raise StopIteration()
prime_number_iterator = PrimeNumbers(n=10)
for number in prime_number_iterator:
print(number)