簡體   English   中英

Python 無限循環 for else

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM