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