You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

这里的逻辑是:

  1. 对每个x,用all()检查生成器(x % y != 0 for y in range(2, int(x**0.5) + 1))里的所有条件是否都成立——如果都成立,说明x不能被2到它平方根之间的任何数整除,也就是质数。
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 09:27:32