2013-03-14 41 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