Python计算2到n间质数和报错‘生成器不可调用’求助
解决Python质数求和时"The generator is not callable"错误
嘿,我来帮你排查这个问题!你遇到的"The generator is not callable"错误,核心原因是你给filter()函数传的第一个参数不对——你把一个生成器表达式直接当成了过滤函数,但生成器本身并不是可调用的函数,而filter()要求第一个参数必须是能返回布尔值的可调用对象(比如函数、lambda表达式)。
咱们来拆解下你的代码问题:
- 你原本的思路是想判断每个数是否能被2到它自身之间的数整除,但错误地用
(lambda n: n%y != 0 for y in range(2, n))这个生成器代替了合法的过滤函数。生成器是用来迭代产生值的,不是用来做判断的可调用对象,所以Python会报错说它不可调用。 - 另外,你用
sum作为变量名其实不太合适,这会覆盖Python内置的sum()函数,虽然这里没直接出问题,但后续可能引发意外bug,建议换成别的名字比如prime_sum。
下面给你两种修正后的可行方案:
方案一:用lambda结合all()函数(简洁写法)
n = int(input()) prime_sum = sum(filter(lambda x: all(x % y != 0 for y in range(2, int(x**0.5) + 1)), range(2, n+1))) print(prime_sum)
这里的逻辑是:
- 对每个
x,用all()检查生成器(x % y != 0 for y in range(2, int(x**0.5) + 1))里的所有条件是否都成立——如果都成立,说明x不能被2到它平方根之间的任何数整除,也就是质数。 filter()会把所有满足条件的质数筛选出来,最后用sum()直接求和。
方案二:定义独立的质数判断函数(可读性更高)
如果觉得lambda写法有点绕,也可以单独写一个判断质数的函数,代码更清晰:
def is_prime(x): if x < 2: return False # 只需要检查到x的平方根就够了,优化效率 for y in range(2, int(x**0.5) + 1): if x % y == 0: return False return True n = int(input()) prime_sum = sum(filter(is_prime, range(2, n+1))) print(prime_sum)
这两种方案都能正确计算2到n之间所有质数的和,也解决了你之前的错误~
内容的提问来源于stack exchange,提问作者Vandit
相关产品推荐
相关产品推荐

