繁体   English   中英

无法弄清楚如何使用all()在我的“代码”中工作

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM