Вернуть список чисел но в обратном порядке
Нужна помощь, есть класс который возвращает список простых чисел:
class LowerPrime:
def __init__(self, number: int):
self.lower_numbers = []
self.number = number
self.it = 1
def __iter__(self):
self.it = 1
return self
def get_lower_numbers(self):
self.it += 1
for lower in self.lower_numbers:
if self.it % lower == 0:
return False
return True
def __next__(self):
while self.it < self.number:
if self.get_lower_numbers():
self.lower_numbers.append(self.it)
return self.it
else:
raise StopIteration()
lower_prime = LowerPrime(number=11)
lower_prime_it = iter(lower_prime)
print(next(lower_prime_it)) # == 7
print(next(lower_prime_it)) # == 5
print(next(lower_prime_it)) # == 3
print(next(lower_prime_it)) # == 2
Но при возврате простого числа, он возвращает простые числа в обратном порядке, нужно например 7, 5, 3, 2 он возвращает 2, 3, 5, 7. Также нужно что бы при наличии наименьшего простого 2 возвращалось raise StopIteration.
Ответы (1 шт):
По вашему алгоритму простые числа генерируются начиная с наименьших. Причем при поиске следующего простого числа используются ранее сгенерированные. Поэтому и выводятся начиная с наименьших.
Как вариант - в init сразу генерируете весь список простых чисел, а в next просто проходите по нему с конца и возвращаете числа.
class LowerPrime:
def __init__(self, number: int):
self.lower_numbers = []
self.number = number
self.it = 1
while self.it < self.number-1:
self.it += 2 # вынесено сюда из функции get_lower_numbers()
if self.get_lower_numbers():
self.lower_numbers.append(self.it)
# self.lower_numbers = self.lower_numbers[::-1] # реверс списка - можно не делать
# print(self.lower_numbers) # посмотреть сгенерированный список
Ещё, на мой взгляд увеличение итератора self.it должно быть не в методе get_lower_numbers(), а в цикле генерации параметров.
Остается только в методе __next__() пройти по списку и выдать все числа по одному.
Ещё маленькая оптимизация - проверять нужно только нечетные числа (т.к. четные делятся на 2). Поэтому итератор нужно увеличивать не на 1, а на 2 - тогда будут проверяться числа 3,5,7,9 ...