我正在尝试使用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不起作用= \
任何人有任何提示吗?
答案 0 :(得分:2)
您的代码会发生一些奇怪的事情。
filter()
,而不是reduce()
。lambda x: isPrime(x)
相当于isPrime
(毕竟,isPrime
已经是一个返回isPrime
}结果的函数。[range(200)]
创建一个嵌套列表。外部列表中唯一的元素是一个数字从0到200的列表。我想你只需要单个列表。所以,请尝试以下方法:
print filter(isPrime, range(200))
答案 1 :(得分: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)]