Почему оператор break необходим в этом цикле for ?[Python]

#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 .