[英]Can't figure out how to use all() to work in my “code”
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,那么如果y> x / 3,可以使用语句(break?)来停止循环,如下所示:
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
您必须向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
最后一个是最好的,因为它利用了短路的优势。
但是,您对代码中all
的调用毫无意义。 在我看来,代码背后的想法是遍历m
所有值,并删除那些可被2到2000000之间的任何数字整除的值。一旦完成, m
将仅包含质数。
当然,如果删除all
,您的代码仍然无法正常工作。 这是因为您实际上正在测试m
每个数字是否可被数字[1, 3, 5, 7...1999999]
。 (这是xrange(1, 2000000, 2)
表示的序列。因为您从1
开始,并且所有内容都可以被1
整除,所以您的代码将不算作素数。然后,从该序列中删除1
,所有内容都可以被整除您的代码会将2
视为素数!您应该更仔细地考虑内部循环中实际上必须测试的数字。
最后,您应该考虑该代码将完成多少个循环。 即使您进行了这项工作,生成结果也将花费很长时间 。 您应该首先对较小的数字进行测试; 然后,您应该考虑如何减少循环次数。 (而且- 仅在您考虑了一下之后-阅读此内容 。)
但是一旦完成这项工作,您要做的就是在素数列表中调用sum
。
您对all
内容的使用all
错误的,如果您查看它的文档 ,那将是一个可迭代的过程。
您可能想做的是使用生成器表达式,其形式如下:
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)
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...'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.