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
这就是我写的。这是一个问题,试图添加所有的素数以下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
答案 0 :(得分:9)
你必须将一个序列或者iterable传递给all
- 它只测试传递给它的所有项是否都为true。这是使用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
最后一个是最好的,因为它利用了short-circuiting。
但是,您在代码中对all
的调用毫无意义。在我看来,你的代码背后的想法是遍历m
中的所有值,并删除那些可被2到2000000之间的任何数字整除的值。一旦你完成了,{{1将只包含素数。
当然,如果删除m
,您的代码仍然无效。这是因为您实际上正在测试all
中的每个数字是否可以被数字m
整除。 (这是由[1, 3, 5, 7...1999999]
表示的序列。因为你从xrange(1, 2000000, 2)
开始,并且所有内容都可以被1
整除,所以你的代码将不算作素数。然后,一旦你从该序列中移除1
,被1
整除的任何内容都将被您的代码视为素数!您应该更仔细地考虑您实际需要在内循环中测试哪些数字。
最后,您应该考虑此代码将完成多少循环。即使你有这个工作,也需要很长时间来生成结果。你应该先用较小的数字进行测试;然后,你应该考虑如何减少循环次数。 (而且 - 只有在之后你才想到它 - 阅读this。)
但是一旦你有了这个工作,你所要做的就是在你的素数列表上调用2
。
答案 1 :(得分:1)
您对all
的使用不正确,如果您查看documentation,则需要进行迭代。
您可能要做的是使用生成器表达式,其形式为:
sum(x**2 for x in range(10))
与列表理解非常相似
[x**2 for x in range(10)]
但是,如果找到除数,以这种方式使用all
不会突然停止生成器表达式。使用any
并检查x == 0
会更快停止,但由于代码目前已格式化,因此会在确定某些素数之前检查许多除数。
这更合适:
primes = []
MAX = 2000000
number = 2
while number < MAX:
for prime in primes:
if number % prime == 0:
number += 1
continue
primes.append(number)
number += 1
total = sum(primes)
答案 2 :(得分:0)
all()
对参数采用迭代。在你的情况下,你会像这样使用它:
all(x%y for y in m)
其中x%y for y in m
是生成器表达式。
如果我有一个可迭代的
[item1, item2, item3, item4...]
all(iterable)
相当于:
item1 and item2 and item3 and item4...'