Python教程中使用break命令的问题

2 投票
5 回答
10189 浏览
提问于 2025-04-15 15:23

我正在按照他们网站上的Python教程学习,现在到了“break”和“continue”这一部分。我刚试了这个示例代码。

>>> 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 个回答

0

你可能需要更新你的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
1

我猜你的'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')
4

你展示的输出结果中包含次字符串"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

撰写回答