Проблема с использованием команды break в руководстве по Python
Вопрос
Я следую руководству по 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.