1

我正在尝试使用 lambda 函数在 Python 中获得低于 2,000,000 的所有质数的总和。(我已经暴力破解了,但这需要的时间太长了,我想要一个更好的解决方案。)这是我目前所拥有的:

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 递增的数字,所以我认为 reduce 不起作用=\

有人有任何提示吗?

4

2 回答 2

2

您的代码发生了一些奇怪的事情。

  • 我认为您实际上想要使用filter(),而不是reduce().
  • lambda x: isPrime(x)等价于isPrime(毕竟isPrime已经是返回结果的函数了isPrime)。
  • [range(200)]创建一个嵌套列表。外部列表中唯一的元素是数字从 0 到 200 的列表。我认为您只需要单个列表。

因此,请尝试以下操作:

print filter(isPrime, range(200))
于 2013-03-14T22:44:21.013 回答
2

这里有很多问题。第一个是您可以lambda x: isPrime(x)简单地替换为isPrime。函数是 Python 中的第一类,这意味着您可以像传递整数或字符串一样传递它们。第二个是您正在传递一个列表列表;[range(200)]是一个包含range(200)范围返回值的列表,返回一个列表,因此您只减少一个值。这解决了第三个问题,即您的reduce 函数应该接受2 个参数,因为reduce 调用该函数作为时间传递给成对的项目。实际上,只有一个项目,因此该函数被调用 0 次,并返回列表中的第一个项目。

我怀疑您想要做的是过滤列表,您可以使用该filter函数来执行此操作,也可以使用如下所示的列表理解:

[x for x in range(200) if isPrime(x)]
于 2013-03-14T22:46:35.603 回答