带有for else的Python无限循环



我正在编写一个函数来计算素数。我尝试使用嵌套在while循环中的for-break-else框架。然而,我得到了一个无限循环。我知道else的缩进不正确。在我将else向前移动并使其与for,平行后,问题得到了解决。然而,我很难理解为什么else块的原始位置会给我无限循环。有人能帮我吗?谢谢

def count_primes(num):
primes = [2]
x = 3
if num < 2:
return 0
else:
while x <= num:
for y in range(3,x,2):
if x%y ==0:
x += 2
break #jump out the for loop
else:
primes.append(x)
x +=2 
return primes

在函数中,您将变量x初始化为3,但在for循环中,您定义了从y=3到x=3的循环范围。您应该记住,范围函数范围(a,b(

a到(b-1(对于您的代码,我会将x初始化为5,以便执行循环:

def count_primes(num):
primes = [2]
x = 5
if num < 2:
return 0
else:
while x <= num:
for y in range(3, x, 2):
if x % y == 0:
x += 2
break  # jump out the for loop
else:
primes.append(x)
x += 2
return primes

但是经过测试,很明显你的代码不会给你一个正确的答案。使用num=100测试函数会得到以下结果,这是不正确的(例如21不是素数(:

>>> count_primes(100)
[2, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99, 101, 103, 105, 107, 109, 111, 113, 115, 117, 119, 121, 123, 125, 127, 129]

为了保持您试图实现的逻辑,这里有另一个返回列表或素数的解决方案:

def count_primes(num):
if num <= 1:
return []
primes = [2]
x = 3
while x <= num:
is_prime = True
for prime_numbers in primes:
if x % prime_numbers == 0:
is_prime = False
break
if is_prime:
primes.append(x)
x += 2
return primes

用num=100测试它,可以得到100以下素数的正确列表:

>>> count_primes(100)
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

Python使用缩进来指示代码块。当else和if在一起时,它每次都会被解雇。这会使x的值增加x+=2。每当if语句为false时,这会增加循环的范围,从而导致无限循环。当else与并行时,x+=2语句仅在for循环条件为false时执行。

else:
primes.append(x)
x +=2 

最新更新