我有以下代码:
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)
您写了for i in range(2,n):
和在起点n=2
。因此,您的范围将为range(2,2)
,因此它将返回空列表,因此此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
中零件号将增加1,然后在下一次迭代中,您的for循环将变为for x in range(2,3)
,因此,此时for循环将成功执行...
对于for...else
Reference
由于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):
这意味着范围是(2,2)循环从未开始,因为它的开始和结束与2-2相同。