Python 中的 while 循环无法正常工作

While loop not working properly in Python

所以我试图找到第 6 个素数,但 getPrime 中的 while 循环无法正常工作。它应该在 count 大于 num 时结束,但事实并非如此。 如果你能帮我找出原因就太好了。

import math

def isPrime(num):
    if num == 1:
        return False
    if num % 2 == 0 and num > 2:
        return False
    for i in range(3, int(math.sqrt(num))+1, 2):
        if num % i == 0:
            return False
    return True

def getPrime(num):
    count = 1
    while count < num:
        for i in range(1, 20):
            #print "check"
            if isPrime(i):
                print "prime", i
                count += 1
                print "count", count
            else:
                continue
    print i
    return i

getPrime(6)

getPrime() 函数中,当 isPrime(i) returns False 时,您不会递增 count 变量。所以 while count < num 循环会卡在那个点。

更新:嗯,这是我看代码的第一印象。但后来我注意到嵌套循环。所以我可能误读了发生的事情。

此时我推荐的是在调试器中单步调试代码,这样您就可以亲眼看到发生了什么。您有可用的 Python 调试器吗?

如果你有一个好的调试器并且知道如何使用它,你几乎可以自己回答任何像这样的问题。这样您就不必等待您在 Stack Overflow 上的朋友来猜测出了什么问题! :-)

原因是你的range语句在while语句的主体内。在另一种语言中,您可能会使用 do...until 语句,但在 Python 中,这样做的方法只是添加一个条件中断语句,例如我已将您的代码更正为:

def getPrime(num):
    count = 1
    for i in range(1, 20):
        if count > num: break
        if isPrime(i):
            highestPrime = i
            count += 1
    return highestPrime

简化getPrime,不需要while循环:

def getPrime(num, r):
    gen = (i for i in r if isPrime(i))
    primes = zip(*zip(range(num), gen))[1]
    return primes[num-1] if len(primes) >= num else None

>>> print getPrime(6, xrange(1, 20))
13
>>> print getPrime(6, xrange(100, 500))
127

您只是在 for 循环结束时检查 count 的值,因此您最终总是会测试 1-20 的整个范围。为什么范围限制在20?

您根本不需要 for 循环。使用 while 循环不断寻找素数,直到找到 num 个素数。

试试这样的东西:

def getPrime(num):
    count = 0 
    i = 1 
    highPrime = None 
    while count < num:
        if isPrime(i):
            count += 1
            highPrime = i 
        i += 1
    return highPrime