[英]Python infinite loop with for else
我正在編寫一個函數來計算素數。 我嘗試使用嵌套在 while 循環中的 for-break-else 框架。 但是,我得到了一個無限循環。 我知道else
沒有正確的縮進。 在我向前移動else
並將其與for,
平行后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。您應該記住范圍函數range(a,b)從a 到 ( b-1) 。 因此,您的循環試圖循環 3 到 2,這是不可能的,因此您永遠不會執行其中的代碼。 這就是為什么你有一個無限循環,因為它總是試圖運行循環,然后不能,然后回到 while 循環,而不增加 x。
為了您的代碼,我將在 5 處初始化 x 以執行循環:
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 一起使用時,每次 if 錯誤時它都會被觸發。 這將 x 的值增加 x+=2。 這會增加每次 if 語句為 false 時循環的范圍,從而導致無限循環。 當 else 與 for x+=2 並行時,僅當 for 循環條件為假時才會執行。
else:
primes.append(x)
x +=2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.