簡體   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