首页 > 解决方案 > Python无限循环与for else

问题描述

我正在编写一个计算素数的函数。我尝试使用嵌套在 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
                    

标签: pythonloopsfor-loopwhile-loopbreak

解决方案


在您的函数中,您将变量 x 初始化为 3,但在 for 循环中,您将循环范围定义为从 y = 3 到 x = 3。您应该记住范围函数range(a,b)a 到 ( b-1)。因此,您的循环试图循环 3 到 2,这是不可能的,因此您永远不会执行其中的代码。这就是为什么你有一个无限循环,因为它总是试图运行循环,然后不能,然后回到 while 循环,而不增加 x。

为了您的代码的目的,我会将 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]

推荐阅读