2013-03-14 34 views
0

我試圖在lambda函數中得到所有低於2,000,000的素數的總和。 (我bruteforced它,但那要花費太長了,我希望有一個更好的解決方案。)這是我到目前爲止有:Python:獲得Lambda函數的總和

def isPrime(n): 
    for x in range(2, int(n**0.5)+1): 
     if n%x==0: return False 
    return True 


print reduce(lambda x: isPrime(x), [range(200)]) 

現在,這只是打印數遞增從1到200,所以我不認爲減少工作= \

任何人有任何提示嗎?

+0

傳遞給'功能reduce()'帶*兩個*參數;先前的結果和序列中的當前元素。你想使用filter()嗎? – 2013-03-14 22:39:05

+0

而'[range(200)]'創建一個包含* one *元素的列表,另一個200個數字的列表。當輸入列表中只有一個元素時,reduce()不做* nothing *並返回該輸入元素。 – 2013-03-14 22:40:16

+0

我給了它兩個參數;該序列位於括號內,範圍(200)。 – Tetramputechture 2013-03-14 22:40:47

回答

2

你的代碼有一些奇怪的事情發生。

  • 我想你實際上想要使用filter()而不是reduce()
  • lambda x: isPrime(x)相當於isPrime(畢竟,isPrime已經是一個函數,返回isPrime的結果)。
  • [range(200)]創建一個嵌套列表。外部列表中唯一的元素是一個數字從0到200的列表。我想你只是想要單個列表。

所以,請嘗試以下操作:

print filter(isPrime, range(200)) 
+0

有沒有什麼辦法可以將值增加2,這樣我可以更有效率?我使用sum(filter(isPrime,range(2000000))),我需要這個比暴力方法更快。 – Tetramputechture 2013-03-14 22:49:07

+1

您的isPrime函數是該方法的強力部分。改進它將比任何元素總和的優化方法在性能上有更大的改進。 – 2013-03-14 22:53:51

+1

@Tetramputechture使用'range(1,200,2)'增加2,但泰勒是正確的,你的焦點應該是一個更好的素數測試函數。 [這個答案應該有幫助](http://stackoverflow.com/a/2068548/505154)。 – 2013-03-14 23:01:46

2

有很多事情錯在這裏。首先,您可以用isPrime來代替lambda x: isPrime(x)。函數是Python中的第一類,這意味着你可以像整數或字符串一樣傳遞它們。第二個是你正在傳遞一個列表清單; [range(200)]是一個包含range(200)返回值的列表,返回一個列表,因此您只能減少一個值。這解決了第三個問題,那就是你的reduce函數應該接受2個參數,因爲reduce作爲時間函數傳遞函數對。實際上,只有一個項目,因此該函數被調用0次並返回列表中的第一個項目。

我懷疑什麼,你想要做的就是過濾列表,你可以使用filter功能來做到這一點,或者你可以用一個列表理解這應該是這樣的:

[x for x in range(200) if isPrime(x)] 
+0

非常感謝。我仍然在學習Python:P – Tetramputechture 2013-03-14 22:51:18

+1

它顯示:P在Python命令行中,回答2個問題的增量,嘗試'help(range)'。 – Steve 2013-03-14 22:53:00

+0

只是一個更多的東西:)爲什麼我打印15當我輸入 打印總和([x爲範圍內的x(1,10,2)如果isPrime(x)]) – Tetramputechture 2013-03-14 22:58:12