虽然循环在Python中无法正常工作

时间:2015-02-10 08:08:54

标签: python while-loop

所以我试图找到第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)

4 个答案:

答案 0 :(得分:2)

getPrime()函数中,当isPrime(i)返回False时,您没有递增count变量。所以while count < num循环在那时停滞不前。

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

此时我建议您逐步调试调试器中的代码,以便自己查看正在发生的事情。你有Python调试器吗?

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

答案 1 :(得分:2)

原因是因为您的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

答案 2 :(得分:0)

简化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

答案 3 :(得分:0)

您只是在for循环结束时检查count的值,因此您将始终以1-20的全部范围进行测试。为什么范围限制在20?

根本不需要for循环。使用while循环继续查找素数,直到你有num个。{/ p>

尝试类似:

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