Python中找出列表内所有质数的代码问题排查
问题原因及解决办法
原因分析
你的代码只输出1 is not prime.,核心问题有三个:
- 内层循环范围错误:
处理2时,int(2/2)+1 = 2,range(2,2)是空序列,内层循环直接跳过,没有执行任何print语句;
处理3时,int(3/2)+1 = 2,同样range(2,2)为空,内层循环不执行,自然没有输出。 - 质数判断逻辑错误:
你在内层循环里每一次取余判断都直接输出结果,既会导致一个数被多次输出,也没遵循「遍历完所有可能因数都没找到才是质数」的核心逻辑。 - 缩进不规范:
原代码中else块的缩进和对应的if arr[i] > 1不匹配,虽当前未直接报错,但会导致代码逻辑混乱,属于Python语法的隐患。
解决办法
修正后的代码优化了循环范围、判断逻辑,同时规范了缩进:
arr = [1,2,3] for num in arr: if num <= 1: print(num, "is not prime") continue # 先假设当前数是质数 is_prime = True # 循环范围优化到num的平方根,提升判断效率 for j in range(2, int(num**0.5) + 1): if num % j == 0: is_prime = False break # 找到因数就跳出循环,无需继续判断 print(num, "is prime" if is_prime else "is not prime")
关键优化点:
- 直接遍历列表元素而非通过索引,避免
range(len())带来的冗余索引操作,代码更简洁易读; - 采用「先假设为质数,找到因数再标记为非质数」的逻辑,遍历结束后统一输出,逻辑更清晰;
- 将内层循环范围改为
range(2, int(num**0.5)+1),因为一个数若有因数,其中一个必然小于等于它的平方根,大幅提升判断效率; - 用
continue跳过小于等于1的数的后续判断,代码结构更简洁。
内容的提问来源于stack exchange,提问作者Gelexi
相关产品推荐
相关产品推荐

