Python用while和is_prime生成前100个素数出现死循环怎么解决
问题原因
- 核心原因是
is_prime函数的判断顺序逻辑错误:你将n%2==0的判断放在了n==2的判断之前,2作为唯一的偶素数,会被if n%2==0 or n<2: return False直接判定为非素数返回,后续的n==2判断永远不会触发。这就导致程序永远收集不到第一个素数,first_primes列表长度始终为0,外层while len(first_primes)<100的条件永远满足,进入无限循环。你手动终止程序时触发的KeyboardInterrupt正好落在程序执行占比最高的is_prime循环判断行,属于正常的终止报错,不是代码本身的语法错误。 - 次要问题是循环嵌套逻辑冗余:外层while循环判断长度,内层又写了遍历0到100万的for循环,就算修复了
is_prime的逻辑,内层for也会一次性把0到100万的所有素数都塞进列表,远超过100个的需求,完全没必要。 - 额外优化点:
is_prime里的循环遍历到n完全没必要,素数判断只需要遍历到√n即可,因为如果n有大于√n的因数,那对应的另一个因数必然小于√n,早就被检测到了。
修复方案
- 调整
is_prime函数的判断顺序,把边界值判断提前,同时优化循环范围提升效率 - 去掉冗余的嵌套for循环,直接逐个递增数字判断,收集够100个素数就停止
修复后的完整代码如下:
def is_prime(n): if isinstance(n,int) == False: return False # 先做边界值判断 if n < 2: return False if n == 2 or n == 3: return True # 再排除偶数和3的倍数 if n%2 == 0 or n%3 == 0: return False # 循环范围优化到平方根,步长设为2跳过偶数 for i in range(5, int(n**0.5) + 1, 2): if n % i == 0: return False return True first_primes = [] current_num = 2 while len(first_primes) < 100: if is_prime(current_num): first_primes.append(current_num) current_num += 1 print(first_primes)
内容的提问来源于stack exchange,提问作者vvvvvvvvv
相关产品推荐
相关产品推荐

