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

Python生成器质数生成函数输出重复数值问题求助

问题分析与修复

你的代码出现重复输出的核心问题有两个,我们逐一拆解来看:

1. 缩进错误(直接导致重复输出的元凶)

看你提供的代码,else块是和for循环对齐的,这是正确写法(只有当for循环正常结束、没被break中断时,才会执行else里的yield)。但你的输出显示同一个质数被多次输出,这说明你实际运行的代码里,else块的缩进大概率是和if对齐的,也就是写成了这样:

for i in range(2, sq+1):
    if num % i == 0:
        break
    else:
        yield num

如果是这种情况,每次循环中只要num不能被当前的i整除,就会执行yield num,导致同一个num被多次生成。比如num=5时,会检查i=2和i=3,两次都不能整除,所以会yield两次5;num=7时会检查i=2、3、4,三次都不能整除,所以yield三次7,和你看到的输出完全匹配。

2. 平方根计算的表达式错误

你写的 sq = math.ceil(num**1/2) 并没有计算num的平方根,而是做了**num除以2**的操作。因为Python中运算符优先级里,**高于/,但num**1就是num本身,所以整个表达式等价于 num / 2,而不是 num ** (1/2)(这才是计算平方根的正确写法)。

这个错误会让你判断质数时的检查范围远大于实际需要(质数判断只需要检查到平方根即可),不仅降低代码效率,还可能导致某些合数被误判为质数(比如你输出里的9,正常来说它不是质数,但错误的检查范围可能因为逻辑漏洞被误判)。

修正后的代码

把两个问题都修复后,代码应该是这样的:

import math

def prime_num():
    num = 2
    while num < 20:
        # 正确计算平方根的向上取整
        sq = math.ceil(math.sqrt(num))
        for i in range(2, sq + 1):
            if num % i == 0:
                break
        # else和for对齐,确保只有循环正常结束时才yield
        else:
            yield num
        num += 1

pr = prime_num()
for i in pr:
    print(i)

运行这段代码,输出会是正确的质数序列:2 3 5 7 11 13 17 19

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 23:13:10