You need to enable JavaScript to run this app. Python Sieve of Eratosthenes生成器仅输出生成器对象,如何打印素数列表
优惠活动
大模型
产品
解决方案
定价
更多

Python Sieve of Eratosthenes生成器仅输出生成器对象,如何打印素数列表

埃氏筛代码问题定位与修正

现存代码的核心错误

  • 函数内包含yield关键字时,Python会将其自动识别为生成器函数,直接调用仅会返回生成器对象,不会执行内部逻辑产出值,因此print(sieve(10))只会输出生成器的内存地址提示
  • 素数标记数组初始化存在运算符优先级错误:原代码[False] * 2 + [True] * limit-2的运算顺序为“先执行列表乘法→执行列表加法→尝试对列表执行减2操作”,直接触发类型错误,完全无法运行
  • 生成器函数内的return语句仅用于终止迭代流程,不会将返回值作为迭代内容传递;且循环内遇到yield会暂停执行,写在循环后的素数收集逻辑根本没有运行机会

修正后的可运行版本

普通列表返回写法(无生成器特性,直接拿到完整素数列表)

def sieve(limit):
    # 加括号明确初始化逻辑:总长度为limit,0、1位置标记为非素数
    count = [False] * 2 + [True] * (limit - 2)
    primes = []
    for num, prime in enumerate(count):
        if prime:
            primes.append(num)
            # 从num的平方位置开始,筛掉所有num的倍数
            for ind in range(num * num, limit, num):
                count[ind] = False
    return primes

print(sieve(10))

运行输出:[2, 3, 5, 7],完全匹配10以内的素数集合

保留生成器特性的写法(惰性迭代,按需取值)

如果需要保留生成器的惰性计算特性,可去掉冗余的return逻辑,调用时将生成器对象转换为列表即可:

def sieve(limit):
    count = [False] * 2 + [True] * (limit - 2)
    for num, prime in enumerate(count):
        if prime:
            yield num
            for ind in range(num * num, limit, num):
                count[ind] = False

# 收集生成器的全部输出为列表
print(list(sieve(10)))

内容的提问来源于stack exchange,提问作者kenneh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.11 07:06:01