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

时间:2012-05-27 11:42:55

标签: 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

这就是我写的。这是一个问题,试图添加所有的素数以下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

3 个答案:

答案 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...'