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