Python:获取Lambda函数的和

1 投票
2 回答
2536 浏览
提问于 2025-04-17 19:09

我正在尝试用Python计算所有小于2,000,000的质数的总和,并且想用一个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,所以我觉得reduce函数没有起作用 =\

有没有人能给我一些建议?

2 个回答

2

这里有很多问题。首先,你可以用简单的 isPrime 来替代 lambda x: isPrime(x)。在Python中,函数是“第一类公民”,这意味着你可以像传递整数或字符串一样传递函数。第二个问题是你传递的是一个列表的列表;[range(200)] 实际上是一个包含 range(200) 返回值的列表,而 range(200) 返回的是一个列表,所以你只是在减少一个单一的值。这也解决了第三个问题,你的 reduce 函数应该接受两个参数,因为 reduce 会将传入的函数作用于一对一对的项。而现在,只有一个项,所以这个函数实际上没有被调用,最后返回的是列表中的第一个项。

我猜你想做的是过滤这个列表,你可以使用 filter 函数来实现,或者你可以使用列表推导式,像这样:

[x for x in range(200) if isPrime(x)]
2

你的代码里有一些奇怪的地方。

  • 我觉得你其实应该用 filter(),而不是 reduce()
  • lambda x: isPrime(x)isPrime 是一样的(毕竟,isPrime 本身就是一个函数,它会返回 isPrime 的结果)。
  • [range(200)] 会创建一个嵌套列表。外面的列表里只有一个元素,那就是从0到200的数字组成的列表。我想你只需要一个简单的列表。

所以,试试下面的代码:

print filter(isPrime, range(200))

撰写回答