2

我在他们的网站上关注 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

但我担心这可能是不好的编码习惯。谢谢您的帮助。

4

5 回答 5

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
于 2009-10-26T14:46:06.350 回答
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')
于 2009-10-26T14:50:28.290 回答
0

You may need to update your Python interpreter.

This code runs correctly for me (notice Python version number):

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
于 2009-10-26T14:43:23.157 回答
0

我认为你的缩进错误。如果我获取您的代码,并缩进 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 缩进的不同。

于 2009-10-26T14:56:28.170 回答
0

我认为else应该始终与if. 这就是我读过的。但是在这个素数生成器代码中,将素数写入一次的唯一方法是elsefor x. 所以我对这种认同没有任何解释。虽然我刚刚开始学习 Python。

于 2011-03-16T17:09:29.597 回答