Python 如何仅在第一次遇到质数时追加到列表
我编写了这段Python代码来打印所有素数,直到1000: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 然而,如果一个数字是素数,它在移动到下一个数字之前会被追加很多次。我尝试使
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对不起,我不清楚。阿尔夫的回答涵盖了我的想法。另见此处: