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
相关产品推荐
相关产品推荐

