Проблема с использованием команды break в руководстве по Python

StackOverflow https://stackoverflow.com/questions/1625174

  •  06-07-2019
  •  | 
  •  

Вопрос

Я следую руководству по python на их сайте, и в настоящее время я нахожусь в разделе "Продолжить перерыв".Я только что попробовал этот пример кода.

>>> for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...             print n, 'equals', x, '*', n/x
...             break
...     else:
...         # loop fell through without finding a factor
...         print n, 'is a prime number'
... 
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3

И вместо того, чтобы выплевывать то, что написано выше, я получаю

3 is a prime number
4 equals 2 * 2
5 is a prime number
5 is a prime number
5 is a prime number
6 equals 2 * 3
7 is a prime number
7 is a prime number
7 is a prime number
7 is a prime number
7 is a prime number
8 equals 2 * 4
9 is a prime number
9 equals 3 * 3

Мне кажется, что он продолжает запускать внутренний цикл for, но почему в руководстве это не учитывается?Устарел ли он для последней сборки интерпретатора (я использую xubuntu jaunty)?

Я смог исправить это, добавив строку

     else:
...                     if n != y:
...                             print n, 'is a prime number'
...                             y = n

но я обеспокоен тем, что это может быть плохой практикой кодирования.Спасибо вам за вашу помощь.

Это было полезно?

Решение

Показанный вами вывод содержит десять раз, когда строка " x является простым числом " ;. Однако эта строка печатается в предложении else внутреннего цикла и как таковая выполняется не более один раз для каждого выполнения внутреннего цикла.

Поскольку внешний цикл выполняет восемь итераций, x является простым числом " не может быть напечатан более чем восемь раз. Таким образом, вывод, который вы выводите , не может быть осуществлен с помощью показанного кода.

Заключение : что-то подозрительно. Можете ли вы показать код так, как вы его выполнили?

<Ч>

Изменить: решено!

Вы неправильно сделали отступ в предложении else, так что Python интерпретировал его как принадлежащий оператору if . Python обрабатывает вкладку как 8 пробелов. Возможно, ваш редактор отображает вкладки в виде 4 пробелов. Таким образом, вы могли пропустить эту ошибку. Согласно PEP 8 , пожалуйста, не смешивайте табуляции и пробелы, и желательно использовать четыре пробела для отступа вашего кода.

>>> for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...             print n, 'equals', x, '*', n/x 
...             break
...         else:
...             # loop fell through without finding a factor
...             print n, 'is a prime number'
... 
3 is a prime number
4 equals 2 * 2
5 is a prime number
5 is a prime number
5 is a prime number
6 equals 2 * 3
7 is a prime number
7 is a prime number
7 is a prime number
7 is a prime number
7 is a prime number
8 equals 2 * 4
9 is a prime number
9 equals 3 * 3

Другие советы

Мое лучшее предположение заключается в том, что ваш оператор 'else:' не имеет правильного отступа, и тогда ваш результат логичен, убедитесь, что ваш else отступ находится на уровне 'for x'.

То есть.вы используете:

for n in range(2,10):
    for x in range(2,n):
        if n%x == 0:
            print(n, '=', x, '*', n/x)
            break
        else:
            print(n, 'is a prime')

вместо того, чтобы:

for n in range(2,10):
    for x in range(2,n):
        if n%x == 0:
            print(n, '=', x, '*', n/x)
            break
    else:
        print(n, 'is a prime')

Возможно, вам придется обновить ваш интерпретатор Python.

Этот код работает для меня правильно (обратите внимание на номер версии Python):

Python 2.6.1 (r261:67515, Dec  6 2008, 16:42:21) 
[GCC 4.0.1 (Apple Computer, Inc. build 5370)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> for n in range(2, 10):
...      for x in range(2, n):
...          if n % x == 0:
...              print n, 'equals', x, '*', n/x
...              break
...      else:
...          # loop fell through without finding a factor
...          print n, 'is a prime number'
... 
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3

Я думаю, вы неправильно расставили отступы.Если я возьму ваш код и сделаю отступ else так, чтобы он находился под оператором if, я получу именно тот результат, который получаете вы.

Приведенный ниже код воспроизводит ваш вывод,

for n in range(2, 10):
    for x in range(2, n):
        if n % x == 0:
            print n, 'equals', x, '*', n/x
            break
        else:
            # loop fell through without finding a factor
            print n, 'is a prime number'

в то время как

for n in range(2, 10):
    for x in range(2, n):
        if n % x == 0:
            print n, 'equals', x, '*', n/x
            break
    else:
        # loop fell through without finding a factor
        print n, 'is a prime number'

Делает то, что вы от него хотите.

Обратите внимание на разницу в отступе else.

Я подумал, что else всегда следует выравнивать с if . Вот что я прочитал. Но в этом коде генератора простых чисел единственный способ получить простые числа, записанные один раз, - это выравнивание else с для x . Таким образом, у меня нет объяснения такой идентичности. Хотя я только начинаю изучать Python.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top