Поиск простых чисел с использованием циклов for в Python

#python-3.x

#python-3.x

Вопрос:

Итак, прежде всего, я понимаю, что есть гораздо более простые способы получить список простых чисел, но я делаю это просто для того, чтобы научиться. У меня очень плохое понимание многого из этого (как вы увидите), поэтому извините, если это глупый вопрос. Я пытаюсь учиться.

 #make an empty list to store primes in
primes = list()

#make a variable to easily change the amount of numbers I test for primality
high_val = 15

#Allocate a range that I will test all numbers in for primality
for n in range(2, high_val):
#Within the previous for loop, start another for loop to test every integer against every 
#value inside the primes list
    for p in primes:
        if n % p == 0:
            print(%s is not prime" % n)
        else:
#If n is prime, I add it to the list and print that it is prime
            primes.append(n)
            print("%s is a prime" % n)
  

Я не знаю, затрудняют ли эти комментарии чтение, но такова моя логика. Для функции нет вывода на печать. Итак, я решил, что в простых числах просто нет значения, мне нужно дать ему что-то для сравнения. Итак, я добавил primes.append(2) в начале сразу после первой строки и изменил диапазон на (3, high_val)…

Если я это сделаю, в итоге будет напечатано около 5 раз для каждого числа, которое является простым, и еще 5 сообщений о том, что оно не является простым. Очевидно, что я делаю что-то совершенно неправильное, если кто-нибудь знает, где я ошибся и / или как это исправить, это было бы очень ценно. Спасибо!

Комментарии:

1. если primes это пустой список, зачем вы перебираете его?

2. Я полагал, что первая итерация найдет 0 терминов в списке, в результате чего он будет думать, что первый член, 2, является простым. Это не дало никаких результатов, но, как я уже сказал, когда я добавил 2 в список простых чисел, он был еще более испорчен, если вообще что-либо.

Ответ №1:

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

По этому поводу рассмотрите возможность использования all :

 primes = [2]
high_val = 15

for n in range(3, high_val, 2):
    if all(n % p == 0 for p in primes):
        print(f"{n} is prime")
        primes.append(n)
    else:
        print(f"{n} is not prime")
  

ps: Я это не тестировал.