Почему мой оператор break не работает в операторе if, хотя оператор print работает?

#python #break

#python #break

Вопрос:

Я писал код, чтобы найти произведение первых n простых чисел.

 def num_primorial(n):
    print(str(n)   "---n2")
    prime_count = 1
    product = 2
    i = 3
    while prime_count < n:
        is_prime = True
        for j in range(3, i, 2):
            if i % j == 0:
                print(str(i)   "****"   str(j))
                is_prime = False
                break
        if is_prime:
            print(i)
            product *= i
            prime_count  = 1
            i =2
    return product
    
print(num_primorial(5))
 

Но в операторе if:

 if i % j == 0:
   print(str(i)   "****"   str(j))
   is_prime = False
   break
 

несмотря на то, что оператор print работает и выполняет цикл, он не выходит из цикла for .

Нажмите, чтобы увидеть результат

Может кто-нибудь, пожалуйста, сказать мне, в чем проблема?

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

1. Какое видимое поведение вы наблюдали, что заставляет вас думать break for , что цикл не прерывается?

2. Я запустил код, и оператор print продолжает повторяться

3. Поскольку у вас есть is_prime = False , он не реализует следующий оператор if после выхода из цикла for . Следовательно, цикл while повторяется снова и снова. Но я все еще чувствую, что какая-то логика кажется неправильной.

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

Ответ №1:

Он завершается правильно ,

Цикл for выполняется снова из-за цикла while

Вы должны добавить еще один break после условия if, чтобы выйти из этого, иначе он выполняется бесконечно

При использовании break внутри цикла for он выходит только из цикла for . У вас есть бесконечный цикл while, который никогда не завершается, поэтому вы снова и снова входите в цикл for

В вашем примере is_prime всегда равно false, поэтому счетчик никогда не меняется

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

1. Проблема заключалась в том, что ‘i’ никогда не меняется, если is_prime имеет значение false . Помещение «i = 2» вне последнего оператора if исправило это.

2. @JACK все равно произойдет сбой, если вы передадите 6 вместо 5

3. Нет, это хорошо работает для любого числа. Спасибо, ваш ответ помог :).

Ответ №2:

Я решил это. Проблема заключалась в том, что «i» никогда не менялся. Таким образом, он просто повторялся снова и снова, потому что значение ‘i’ оставалось неизменным, если is_prime было false . Мне просто нужно было поместить «i = 2» вне последнего оператора if внутри цикла while.

 def num_primorial(n):
prime_count = 1
product = 2
i = 3
while prime_count < n:
    is_prime = True
    for j in range(3, i, 2):
        if i % j == 0:
            is_prime = False
            break
    if is_prime:
        product *= i
        prime_count  = 1
    i =2
return product
 

Теперь он отлично работает для каждого числа.