我是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。虽然我知道还有其他几种(和更好的)生成素数的方法,但我有兴趣使我的方法(代码)工作。
答案 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