Python 如何仅在第一次遇到质数时追加到列表

Python 如何仅在第一次遇到质数时追加到列表,python,for-loop,primes,for-else,Python,For Loop,Primes,For Else,我编写了这段Python代码来打印所有素数,直到1000: primes = [] for prime in xrange(1, 1000): for b in xrange(2, prime): if (prime % b == 0): break else: primes.append(prime) print primes 然而,如果一个数字是素数,它在移动到下一个数字之前会被追加很多次。我尝试使

我编写了这段Python代码来打印所有素数,直到1000:

primes = []

for prime in xrange(1, 1000):
    for b in xrange(2, prime):
        if (prime % b == 0):
            break
        else:
            primes.append(prime)

print primes
然而,如果一个数字是素数,它在移动到下一个数字之前会被追加很多次。我尝试使用
continue
而不是
break
,但这不起作用

我还添加了一些代码(可以工作),以便将数组简单地输出到文本文件中。它太大了,我甚至不能把它粘贴到这里


如何将每个素数只添加到列表中一次而不是多次?

如果它到达循环的末尾而没有找到除数,则只需添加该数

from math import sqrt

prime = True
for b in xrange(2, sqrt(prime)):
    if prime % b == 0:
        prime = False
        break
if prime:
    primes.append(prime)

注意,我添加了一个优化:您只需要测试一个数字的平方根,因为在那之后的任何东西都不可能除法。

您只需要在数字到达循环末尾而没有找到除数时添加该数字

from math import sqrt

prime = True
for b in xrange(2, sqrt(prime)):
    if prime % b == 0:
        prime = False
        break
if prime:
    primes.append(prime)

注意,我添加了一个优化:您只需要测试一个数字的平方根,因为在那之后的任何东西都不可能除法。

Python中有一个功能,您可以在这里非常有效地使用。只需按如下方式更改缩进:

primes = []

for prime in xrange(1, 1000):
    for b in xrange(2, prime):
        if (prime % b == 0):
            break
    else:
        primes.append(prime)

print primes
也就是说,缩进
else
子句。这样,它不是
if
else
,而是
for
循环的
else
for
循环可以有一个
else
分支,该分支在循环执行了所有计划的迭代之后执行。如果调用了
中断
,则不会执行它

您可以在这里使用它,而无需更改许多原始代码

当然,在您的原始版本中,每次循环迭代中,如果测试的数字不是非素数,则会附加测试的数字(这不是您想要的)

还要注意的是,
1
不是质数(至少从1801年高斯开始,有人说甚至从欧几里德(公元前600年)第一次写关于质数的文章开始,尽管19世纪就有异教徒),所以你的外循环应该从
2
开始

但请注意但以理在回答中所写的内容;您不必一步一步地进入
prime
,因为在达到
prime
的平方根后,您可以退出。我总是将
b*b
prime
进行比较,但计算
sqrt(prime)
一次可能更快


当然,完全忽略所有偶数可以更快。除了
2
之外,没有一个是素数;-)

Python中有一个功能,您可以在这里非常有效地使用。只需按如下方式更改缩进:

primes = []

for prime in xrange(1, 1000):
    for b in xrange(2, prime):
        if (prime % b == 0):
            break
    else:
        primes.append(prime)

print primes
也就是说,缩进
else
子句。这样,它不是
if
else
,而是
for
循环的
else
for
循环可以有一个
else
分支,该分支在循环执行了所有计划的迭代之后执行。如果调用了
中断
,则不会执行它

您可以在这里使用它,而无需更改许多原始代码

当然,在您的原始版本中,每次循环迭代中,如果测试的数字不是非素数,则会附加测试的数字(这不是您想要的)

还要注意的是,
1
不是质数(至少从1801年高斯开始,有人说甚至从欧几里德(公元前600年)第一次写关于质数的文章开始,尽管19世纪就有异教徒),所以你的外循环应该从
2
开始

但请注意但以理在回答中所写的内容;您不必一步一步地进入
prime
,因为在达到
prime
的平方根后,您可以退出。我总是将
b*b
prime
进行比较,但计算
sqrt(prime)
一次可能更快


当然,完全忽略所有偶数可以更快。除了
2
之外,没有一个是素数;-)

这个问题与python、数组或for循环无关,本质上是说“请为我调试我的问题”。虽然这是一个有效的问题,但对SO来说是一个糟糕的格式。你转录的正确吗?如果'else:'块连接到'for'循环,那么看起来是正确的。哦,我明白了。谢谢@weeble对不起,我不清楚。阿尔夫的回答涵盖了我的想法。请参见此处:这个问题与python、数组或for循环无关,本质上是说“请为我调试我的问题”。虽然这是一个有效的问题,但对SO来说是一个糟糕的格式。你转录的正确吗?如果'else:'块连接到'for'循环,那么看起来是正确的。哦,我明白了。谢谢@weeble对不起,我不清楚。阿尔夫的回答涵盖了我的想法。另见此处: