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

在我看来,它继续运行内部循环,但为什么教程不考虑这一点?它是否已经过时了最新的解释器构建(我正在运行xubuntu jaunty)?

我可以通过添加行

来修复它
     else:
...                     if n != y:
...                             print n, 'is a prime number'
...                             y = n

但我担心这可能是糟糕的编码习惯。谢谢你的帮助。

有帮助吗?

解决方案

您显示的输出包含十次次字符串“ x 是素数”。但是,此字符串打印在内部循环的 else 子句中,并且每次执行内部循环时最多执行一次

由于外环执行八次迭代,因此“ x 是素数”。不能打印超过八次次。因此,您显示的输出不能由显示的代码带来。

结论:有些东西可疑。你可以在执行时显示代码吗?


编辑:已解决!

您错误地缩进了else子句,因此Python将其解释为属于 if 语句。 Python将选项卡视为 8 空格。也许您的编辑器将标签显示为 4 空格。那样你可能错过了这个bug。根据 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:'语句没有正确缩进,然后你的结果是合乎逻辑的,检查你的其他缩进是否与'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

我认为你的缩进错了。如果我接受你的代码,并缩进其他内容以使它在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 应始终与对齐。这就是我读过的。但是在这个素数生成器代码中,将一次素数写入的唯一方法是将 else for x 对齐。所以我对这种认同没有任何解释。虽然我刚开始学习Python。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top