For循环在while循环中断开

时间:2013-04-14 01:19:40

标签: python if-statement break

这是我的代码:

primes = [2, 3]

while len(primes) != 1001:
    a = primes[-1] + 2
    for i in primes:
        if a % i == 0:
            break
    else:
        print(primes)
        primes.append(a)

print(primes[1002])

这应该创建一个列表,直到第1001个素数,然后打印第1001个数字。它首先取列表中的最后一个数字并加2,然后检查给定数字是否可被素数列表的任何成员整除。如果它是可整除的,则for循环中断并跳过else子句。如果不是,则将该数字附加到素数列表。重复该过程,直到列表的长度为1001.循环结束后,将打印最后一个数字。

然而,输出如下:

[2, 3]
[2, 3, 5]
_

在手动执行之前,程序不会终止。你能告诉我我做错了什么吗?

3 个答案:

答案 0 :(得分:5)

这是因为,在primes[-1] + 2不是素数的情况下,没有状态被改变(所以程序永远循环)。

更好的方法可能是:

 from itertools import count

 primes = [2, 3]
 for a in count(5, step=2):
     for p in primes:
         if a % p == 0:
             break
     else:
         primes.append(a)
         if len(primes) > 1001:
             break

答案 1 :(得分:1)

您点击的第一个非素数aa停止增长。这有效:

primes = [2, 3]

a = 3
while len(primes) != 1001:
    a += 2
    for i in primes:
        if a % i == 0:
            break
    else:
        print(primes) # I'm not sure why you'd want to do this
        primes.append(a)

print(primes[1000]) # Note the index: 1000, not 1002

答案 2 :(得分:0)

首先,我要提醒不要在while循环中使用==和!=,除非你能保证会达到sentinel值。你可能想要使用:而len(primes)< 1000:例如。

同样,您需要确保最终达到循环的退出条件。

另一个选择是使用而True:作为循环标题,并在循环内部进行其他处理。 (例如if iteration_count > 1000000 or len(primes > 1000): break ... else iteration_count += 1)。

(想象一下,在你的例子中,多个值附加到素数列表中的一些错误......即使代码的其余部分是正确的,它也可能永远循环 - 数百万个素数后来程序崩溃了存储器)。

循环上的 else:子句是Python特有的一个特性。在大多数其他编程语言中,您必须创建一个sentinel变量并在离开循环后测试其值。可以将循环中的 else:子句视为特定于搜索某些内容的行为...而 else:是在未找到合适项目的情况下执行的代码循环。

鉴于我不确定你在这里真正想做什么。