Проблема с использованием команды break в руководстве по Python - PullRequest
2 голосов
/ 26 октября 2009

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

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

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

Ответы [ 5 ]

4 голосов
/ 26 октября 2009

Вывод, который вы показываете, содержит десять раз строку " 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
1 голос
/ 26 октября 2009

Мое лучшее предположение состоит в том, что ваш оператор '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')
0 голосов
/ 16 марта 2011

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

0 голосов
/ 26 октября 2009

Я думаю, что вы неправильно сделали отступы. Если я возьму ваш код и сделаю отступ для остального, чтобы он находился под оператором 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.

0 голосов
/ 26 октября 2009

Возможно, вам придется обновить ваш интерпретатор 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
...