m = range(1, 2000000, 2)
sum1 = 2
for x in xrange(1, 2000000, 2):
for y in m:
if x != y:
if x%y == 0:
m.remove(x)
if all(x%y != 0):
sum1 += x
Run Code Online (Sandbox Code Playgroud)
这就是我写的.这是一个问题,试图添加所有的素数以下200万.我的问题出在all()语句中.我想要发生的是检查x是否是素数; 只有当每个x%y给出余数时才是这样.
另外,如果我使用a,我可以使用语句(break?)来停止循环,如果y> x/3,就像这样:
m = range(1, 2000000, 2)
sum1 = 2
for x in xrange(1, 2000000, 2):
for y in m:
if y > x/3:
break
else:
if x != y:
if x%y == 0:
m.remove(x)
if all(x%y != 0):
sum1 += x
Run Code Online (Sandbox Code Playgroud)
你必须传递一个序列或迭代all
- 它只测试传递给它的所有项是否都为真.这是正确的使用方式all
:
>>> all([True, True, True])
True
>>> all([True, False, True])
False
>>> all([x > 5 for x in range(10)])
False
>>> all([x > 5 for x in range(6, 10)])
True
>>> all(x > 5 for x in range(6, 10))
True
Run Code Online (Sandbox Code Playgroud)
最后一个是最好的,因为它利用了短路.
但是,您对all
代码的调用毫无意义.在我看来,你的代码背后的想法是遍历所有值m
并删除那些可以被2到2000000之间的任何数字整除的值.一旦你完成了,m
它将只包含素数.
当然,如果删除,您的代码仍然无效all
.那是因为你实际上在测试每个数字m
是否可以被数字整除[1, 3, 5, 7...1999999]
.(这是由...表示的序列xrange(1, 2000000, 2)
.因为你开始1
,并且一切都可以被整除1
,你的代码将不算作素数.然后,一旦你1
从该序列中删除,任何可被整除的东西2
将被你的代码算作素数!你应该更仔细地考虑一下你在内循环中实际需要测试的数字.
最后,您应该考虑此代码将完成多少循环.即使你有这个工作,生成结果也需要很长时间.你应该先用较小的数字进行测试; 然后,你应该考虑如何减少循环次数.(而且 - 只有在您考虑过它之后 - 请阅读此内容.)
但是一旦你有了这个工作,你所要做的就是打电话sum
给你的素数列表.