Бесконечная ошибка при создании списка, содержащего первые 100 простых чисел

#python #performance #infinite-loop #primes

Вопрос:

Таким образом, цель заключается в следующем: используя while цикл и свою is_prime функцию, определите список, содержащий первые 100 простых чисел.

У меня есть мой код функции is_prime, такой как этот:

 def is_prime(n):
    if isinstance(n,int) == False:
        return False
    if n%2==0 or n<2: 
        return False
    if n==2 or n==3: 
        return True
    if n%3 == 0: 
        return False
    for i in range(2, n):
        if n % i == 0:
            return False
    return True
 

Это работает, а затем я написал:

 first_primes = []
while len(first_primes)<100:
    for j in range(0,10**6):
        if is_prime(j) == True:
            first_primes.append(j)
first_primes
 

Тем не менее, код выполняется бесконечно, когда я останавливаю его, я получаю

 KeyboardInterrupt                         Traceback (most recent call last)
<ipython-input-20-0abfdab33706> in <module>
      2 while len(first_primes)<100:
      3     for j in range(0,10**6):
----> 4         if is_prime(j) == True:
      5             first_primes.append(j)

<ipython-input-18-a97bbcf0d07f> in is_prime(n)
      9         return False
     10     for i in range(2, n):
---> 11         if n % i == 0:
     12             return False
     13     return True"
 

Почему происходит эта ошибка? Как я могу это исправить? Спасибо вам за любую помощь!

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

1. Обратите внимание, что 2 является простым , но поскольку вы n % 2 == 0 сначала проверяете, прежде чем проверять, возвращаетесь ли n == 2 вы False .

2. А-а-а, я понял! большое вам спасибо!

Ответ №1:

Это не бесконечный цикл, просто очень длинный и медленный. Ваш for цикл завершается, несмотря ни на что, поэтому вы ждете, пока не найдете каждое простое число, которое меньше 10^6. Ваше while состояние будет обработано только после завершения for цикла. Измените свой код на:

 first_primes = []
for j in range(0, 10**6):
    if is_prime(j):
        first_primes.append(j)
    if len(first_primes) >= 100:
        break
 

Если это задание, и вы должны использовать while цикл, затем попробуйте:

 first_primes = []
j = 2
while len(first_primes) < 100:
    if is_prime(j):
        first_primes.append(j)
    j  = 1
 

Также обратите внимание, что ваша is_prime функция (неправильно) возвращает False значение, указанное в 2 as @ddejohn.

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

1. Спасибо, что напомнили мне! Я даю попытку и все еще жду завершения процесса!

2. @NingzeXia Если вы запускаете свой исходный код, его выполнение может занять очень много времени, так как он становится медленнее по мере j увеличения.

3. я пытаюсь использовать j = 1

4. Я добавил «если len(first_primes) >= 100: разрыв» в свой цикл for, и теперь он работает! Спасибо вам за вашу помощь!