python中的Prime生成器返回多个复合而不是素数

时间:2014-12-05 07:39:02

标签: python primes

我是Python的新手,我正在尝试通过执行Project Euler问题来练习编程。为了解决7th problem,我决定首先使用for循环构建一个简单的素数生成函数,这似乎不起作用。

这是我的代码:

primes = [2]

for n in range(2, 10):
    for m in range(2, n):
        if not(n % m):
            primes.append(n)

print primes

输出为[2,4,6,6,8,8,9]而不是我的意图,即[2,3,5,7]。数学似乎对我来说是正确的:选择一个大于2的自然数n。对于大于1且小于n的所有自然数,请检查n是否可被m整除。如果不是,请将n添加到素数列表中。任何人都可以告诉我我的代码有什么问题吗?

P.S。虽然我知道还有其他几种(和更好的)生成素数的方法,但我有兴趣使我的方法(代码)工作。

1 个答案:

答案 0 :(得分:3)

not(n % m)会告诉您某个号码不是素数。

在您知道数字是否为素数之前,您还需要为每个候选因素执行此操作。

Python在for: else:中有一个非常方便的机制,如果你没有从else中断,它只运行for块。

primes = []
for n in range(2, 10):
    for m in range(2, n):
        if not(n % m):
            break
    else:
        primes.append(n)

您可以使用生成器表达式以类似的方式测试素数:

prime = not(any(n % m == 0 for m in range(2, n)))

记住range在Python 2.x中效率低下,因为它在开始迭代之前生成整个数字列表。除非您使用的是Python 3.x

,否则请使用xrange