Вернуть список чисел но в обратном порядке

Рейтинг: -1Ответов: 1Опубликовано: 13.02.2023

Нужна помощь, есть класс который возвращает список простых чисел:

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 ...