#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, и теперь он работает! Спасибо вам за вашу помощь!