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

Joh*_*n K 3 python python-2.7

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)

sen*_*rle 9

你必须传递一个序列或迭代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给你的素数列表.

  • 请注意,在列表推导上调用`all()`是个坏主意.当发现一个值为"False"的值时,生成器表达式将是"all()"短路的更好选项 - 因此,当您使用生成器表达式时,只计算"True"的值 - 通过列表理解,您可以事先生成它们,然后可能会立即失败.值得注意的是需要*evaluate*到'True`而不是*being*`True`的元素之间的区别.(`all(["test"])`是'True`作为非空字符串*将*评估为'True`尽管不是*是*`True`). (4认同)
  • 因为从来没有一种情况下列表理解比生成器表达更好,并且在大多数情况下情况更糟,我会说除了生成器表达式之外习惯使用任何东西都是一个坏主意.当然,我并不期待你详尽地阐述关于"所有()"的所有观点,但我只是想到我会注意到一些事情. (2认同)