Python - 为什么这是一个无限循环?
Python - why is this an infinite loop?
我有以下代码:
sum_of_primes = 0
n = 2
while n < 10:
for i in range(2,n):
if n%i == 0:
n += 1
break
else:
sum_of_primes += i
n += 1
print(sum_of_primes)
我似乎无法弄清楚为什么这是一个无限循环。
下面是我修改后的有效代码,但我仍然不明白为什么原始代码会产生无限循环:
counter = 0
primes = 0
number = 2
while counter < 10:
for x in range(2, number):
if number % x == 0:
number += 1
counter+=1
break
else:
primes +=number
counter = number
number += 1
print(primes)
你的内循环永远不会执行,因为 range(2, 2)
是空的。由于内循环更新 n
,n
永远不会改变,所以外循环永远不会终止。
n = 2
while n < 10:
for i in range(2,n): # list(range(2,2)) == [] ...
# ... so this loop never executes
# and n is never updated
# so this loop runs forever
最初 n
是 2
。因此,for
循环是 for i in range(2,2)
,这是一个空范围,因此循环永远不会执行。这意味着您永远不会进入可能增加 n
.
的代码
sum_of_primes = 0
n = 2
while n < 10: # n == 2
for i in range(2,n): # loop repeats zero times
if n%i == 0:
n += 1
break
else:
sum_of_primes += i
n += 1
# n == 2 still the case down here.
print(sum_of_primes)
您写了 for i in range(2,n):
并且在起点 n=2
。所以你的范围将是 range(2,2)
所以它将是 return 空列表所以这个 for 循环永远不会执行并且你的程序将进入无限循环。
在第二个代码中,您使用的是 for...else
for x in range(2, number):
if number % x == 0:
number += 1
counter+=1
break
else:
primes +=number
counter = number
number += 1
这里,for...else
的意思是如果for循环不执行一次,则执行for循环的else
部分。在 else
部分你增加了 counter
和 number
.
所以,第一次 number = 2
和 for 循环变成 for x in range(2, number):
意味着 for 循环将不会执行,正如我上面所讨论的,如果 for 循环不是单次执行 else
部分将被执行
所以,在else
part number 将增加1,然后在下一次迭代中你的for 循环变为for x in range(2,3)
所以,此时for 循环将成功执行...
对于for...else
Reference
for i in range(2,n):
这意味着范围是 (2,2) 循环从未开始,因为它的开始和结束与 2-2 相同。
我有以下代码:
sum_of_primes = 0
n = 2
while n < 10:
for i in range(2,n):
if n%i == 0:
n += 1
break
else:
sum_of_primes += i
n += 1
print(sum_of_primes)
我似乎无法弄清楚为什么这是一个无限循环。
下面是我修改后的有效代码,但我仍然不明白为什么原始代码会产生无限循环:
counter = 0
primes = 0
number = 2
while counter < 10:
for x in range(2, number):
if number % x == 0:
number += 1
counter+=1
break
else:
primes +=number
counter = number
number += 1
print(primes)
你的内循环永远不会执行,因为 range(2, 2)
是空的。由于内循环更新 n
,n
永远不会改变,所以外循环永远不会终止。
n = 2
while n < 10:
for i in range(2,n): # list(range(2,2)) == [] ...
# ... so this loop never executes
# and n is never updated
# so this loop runs forever
最初 n
是 2
。因此,for
循环是 for i in range(2,2)
,这是一个空范围,因此循环永远不会执行。这意味着您永远不会进入可能增加 n
.
sum_of_primes = 0
n = 2
while n < 10: # n == 2
for i in range(2,n): # loop repeats zero times
if n%i == 0:
n += 1
break
else:
sum_of_primes += i
n += 1
# n == 2 still the case down here.
print(sum_of_primes)
您写了 for i in range(2,n):
并且在起点 n=2
。所以你的范围将是 range(2,2)
所以它将是 return 空列表所以这个 for 循环永远不会执行并且你的程序将进入无限循环。
在第二个代码中,您使用的是 for...else
for x in range(2, number):
if number % x == 0:
number += 1
counter+=1
break
else:
primes +=number
counter = number
number += 1
这里,for...else
的意思是如果for循环不执行一次,则执行for循环的else
部分。在 else
部分你增加了 counter
和 number
.
所以,第一次 number = 2
和 for 循环变成 for x in range(2, number):
意味着 for 循环将不会执行,正如我上面所讨论的,如果 for 循环不是单次执行 else
部分将被执行
所以,在else
part number 将增加1,然后在下一次迭代中你的for 循环变为for x in range(2,3)
所以,此时for 循环将成功执行...
对于for...else
Reference
for i in range(2,n):
这意味着范围是 (2,2) 循环从未开始,因为它的开始和结束与 2-2 相同。