#python
#python
Вопрос:
def count_primes(num):
primes = [2]
x = 3
if num < 2: # for the case of num = 0 or 1
return 0
while x <= num:
for y in range(3,x,2): # test all odd factors up to x-1
if x%y == 0:
x = 2
break
else:
primes.append(x)
x = 2
print(primes)
return len(primes)
#without break
count_primes(75)
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79]
22
Эй, ребята, немного запутался, как будто я пропускаю break
оператор в цикле for и тестирую count_primes(75), потому что я не включаю break, он также включает 79 в список простых чисел, хотя он был указан while x<=num
. Почему это происходит? Какова полная цель оператора break в этом коде?
Комментарии:
1. Извините, но где
break
отсутствует?2. Это должно быть здесь @quamrana:
while x <= num: for y in range(3,x,2): # test all odd factors up to x-1 if x%y == 0: x = 2 break
3. Возможно, вы могли бы обновить вопрос следующим образом:
# break
гдеbreak
раньше был?4. Я думаю, что ваш отступ неправильный.
for-else
там больше смысла (особенно сbreak
), чемif-else
.5. @VPfB да, извините, только что исправил! Можете ли вы объяснить, почему это for-else здесь?
Ответ №1:
Причина, по которой вам нужно break
, заключается в том, что без него for
цикл продолжает выполняться и может находить другие факторы при каждом выполнении x = 2
. break
Останавливает цикл при первом найденном факторе. Возможно, ваш код должен быть таким:
def count_primes(num):
if num < 2: # for the case of num = 0 or 1
return 0
primes = [2]
x = 3
while x <= num:
for y in range(3, x, 2): # test all odd factors up to x-1
if x % y == 0:
break
else:
primes.append(x)
x = 2
print(primes)
return len(primes)
Комментарии:
1.Это потому, что в конечном итоге
x
становится75
, иfor
цикл находитy=3
, делит на75
и делает,x = 2
а затем продолжает цикл, чтобы найтиy=7
, делит на77
и делает,x =2
а затем продолжает цикл, только на этот раз, чтобы найти79
, не имеет факторов и завершается сx = 81
2. Также еще один вопрос, который меня немного смущает — почему код запускает x=77 и x= 79 и т.д., Если он указал while x<=num ?
3. Выполняется
while x <= num:
только тогда, когда он выполняется, а не в другое время. Когда программа находится вfor
цикле,while
это не имеет никакого эффекта.while
Единственное, что имеет какой-либо эффект, когдаfor
цикл завершается. Это то, чтоbreak
вам дает. Он выходит изfor
цикла, чтобы позволитьwhile
вступить в игру.4. Спасибо 🙂 Также я вижу, что вы изменили положение x = 2 в своем более аккуратном коде ^. Почему это работает, потому что, если вы выходите из цикла for [if x%y==0], вы возвращаетесь обратно к оператору while <=num , поэтому ваш код не будет выполняться x =2?
5. Нет,
break
он выскакивает из ближайшего окружающего цикла, который являетсяfor
циклом, так что самое следующееx = 2
.