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

