Python Can';我不知道如何使用all()在my";代码“;

Python Can';我不知道如何使用all()在my";代码“;,python,python-2.7,Python,Python 2.7,这就是我写的。这是一个问题,试图把200万以下的素数相加。我的问题在all()语句中。我想做的是检查x是否是素数;只有当每x%y给出一个余数时,这才是正确的 另外,如果我使用了一条语句(break?),如果y>x/3,我可以使用一条语句(break?)来停止循环吗 m = range(1, 2000000, 2) sum1 = 2 for x in xrange(1, 2000000, 2): for y in m: if x != y: if x

这就是我写的。这是一个问题,试图把200万以下的素数相加。我的问题在all()语句中。我想做的是检查x是否是素数;只有当每x%y给出一个余数时,这才是正确的

另外,如果我使用了一条语句(break?),如果y>x/3,我可以使用一条语句(break?)来停止循环吗

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

您必须将一个序列或iterable传递给
all
——它只是测试传递给它的所有项的计算结果是否为true。下面是使用
all
的正确方法:

 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
是毫无意义的。在我看来,代码背后的想法是遍历
m
中的所有值,并删除那些可被2到2000000之间的任何数字整除的值。一旦这样做,
m
将只包含素数

当然,如果删除
all
,代码仍然无法工作。这是因为您实际上正在测试
m
中的每个数字是否可以被这些数字整除
[1,3,5,7…1999999]
。(这是由
xrange(1200万,2)表示的序列)
。因为你从
1
开始,所有东西都可以被
1
整除,所以你的代码将不计算素数。然后,一旦你从序列中删除
1
,任何可以被
2
整除的东西都会被你的代码计算为素数!你应该更仔细地考虑你实际需要测试的数字你的内环

最后,您应该考虑这段代码将完成多少个循环。即使这段代码正常工作,生成结果也需要很长时间。您应该首先在较小的数字上测试它;然后,您应该考虑如何减少循环的数量。(并且——只有在您仔细考虑之后——阅读。)

但是,一旦你有了这个功能,你所要做的就是在素数列表中调用
sum

all()
将iterable作为参数。在你的情况下,你可以这样使用它:

>>> 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
其中,
x%y表示m中的y
是一个生成器表达式。 如果我有一个

all(x%y for y in m)
all(iterable)
相当于:

[item1, item2, item3, item4...]

您使用的
all
是不正确的,如果您查看查找它的方法,它需要一个iterable

您可能尝试使用生成器表达式,形式如下:

item1 and item2 and item3 and item4...'
这与列表理解非常相似

sum(x**2 for x in range(10))
但是,以这种方式使用
all
不会突然停止生成器表达式,如果它找到一个除数。使用
any
和检查
x==0
会更快停止,但由于代码当前已格式化,因此会在将某个除数视为素数之前检查许多除数

这将更合适:

[x**2 for x in range(10)]
primes=[]
最大值=2000000
数字=2
当数量<最大值时:
对于素数中的素数:
如果数字%prime==0:
数字+=1
持续
素数。追加(数字)
数字+=1
总计=总和(素数)

以iterable作为参数。你认为
所有的
都能做什么?看起来没有它你的代码是正确的。我发现你在一个例子中使用
range()
而在另一个例子中使用
xrange()
真的很奇怪。除非你真的需要一个列表,否则你应该总是使用
xrange()
或者您正在使用Python3.x,其中
range()
的工作方式与
xrange()
在2.x中的工作方式相同。通常,将嵌套的
if
语句转换为带有
的语句也会使代码更整洁,例如:
if(不是x==y)和(x%y==0):
。同样,您可以在itertools.product(xrange(…),2)中为x,y使用
这里是你的循环,更清晰。另外,我忍不住要问,为什么你的标题中引用了代码?这不是真正的代码吗?放在那里真的很奇怪。任何大于一半的数字都不能被整除。如果你把这一事实包括在内,你可以在代码中节省大量时间。任何大于5的素数都以1,3,7,9结尾。你知道吗测试的内容比您应该做的多得多。请注意,在列表中调用
all()
是个坏主意。生成器表达式将是更好的选择,如
all()
当它找到一个计算结果为
False
的值时会短路-同样,当您使用生成器表达式时,您只计算
True
的值-通过列表理解,您可以预先生成所有值,然后可能会立即失败。同样值得注意的是ng求值为
True
而不是
True
all([“test”])
True
,因为非空字符串求值为
True
,尽管不是
True
)@Lattyware,是的,这里缺少了一些细微的差别,这在某种程度上是一种教学上的简化。我将你关于评估的观点纳入其中。但我会用不同的措辞表达你关于列表理解的观点。这不是一个“坏主意”在这里使用列表理解;在大多数情况下,它不如传递生成器表达式好。我假设OP不熟悉这些构造,这可能是不正确的;但是如果是,从列表到列表理解再到生成器表达式的温和过程似乎是引入它们的正确方式。因为从来没有在这种情况下,列表理解比生成器表达式更好,而在大多数情况下更糟糕,我认为在那里养成使用生成器表达式以外的任何东西的习惯是一个坏主意。当然,我不希望您详细介绍
all()
非常详尽,但我只是想记下一些事情。
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)