While循环在Python中不能正常工作

While循环在Python中不能正常工作,python,while-loop,Python,While Loop,所以我试图找到第六个素数,而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

所以我试图找到第六个素数,而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)
导入数学
def isPrime(num):
如果num==1:
返回错误
如果num%2==0且num>2:
返回错误
对于范围内的i(3,int(math.sqrt(num))+1,2):
如果num%i==0:
返回错误
返回真值
def getPrime(num):
计数=1
计数
getPrime()
函数中,当
isPrime(i)
返回
False
时,您没有增加
计数
变量。因此,
while count
循环在该点卡住

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

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

如果你有一个好的调试器并且知道如何使用它,你几乎可以自己回答任何类似的问题。这样,您就不必等待堆栈溢出上的朋友猜测出哪里出了问题!:-)

getPrime()
函数中,当
isPrime(i)
返回
False
时,不增加
count
变量。因此,
while count
循环在该点卡住

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

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


如果你有一个好的调试器并且知道如何使用它,你几乎可以自己回答任何类似的问题。这样,您就不必等待堆栈溢出上的朋友猜测出哪里出了问题!:-)

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

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

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

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

简化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
def getPrime(num):
计数=0
i=1
高素数=无
计数
您只是在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
def getPrime(num):
计数=0
i=1
高素数=无
计数
简而言之,您想知道0到num之间有多少素数,或者在某个范围内得到最高的素数?为什么只在数组[1,20]中查找素数?为什么精确地使用范围(1,20)?另外,
i
在函数结束时可能根本没有定义/初始化。问题陈述是什么<代码>getPrime(6)
??想要前6个素数或前6个数中的素数??他想要从1开始的第6个素数。那就是:1,3,5,7,11,13。简而言之,你想知道有多少素数在0和num之间,或者得到某个范围内的最高素数?为什么只在数组[1,20]中查找素数?为什么精确地使用范围(1,20)?另外,
i
在函数结束时可能根本没有定义/初始化。问题陈述是什么<代码>getPrime(6)
??想要前6个素数或前6个数中的素数??他想要从1开始的第6个素数。那就是:1,3,5,7,11,13。我对你的答案投了更高的票,但仍然不完全正确。在循环之前添加一个
highestPrime
变量,并在i为素数时为其指定i的当前值。然后你可以返回
highestPrime
,而不是可能没有价值的i。我已经对你的答案投了赞成票,但它仍然不完全正确。在循环之前添加一个
highestPrime
变量,并在i为素数时为其指定i的当前值。然后可以返回
highestPrime
,而不是可能没有值的i。