我的代码在哪里打破[初学者Python]

时间:2016-05-02 14:46:32

标签: python

我正在尝试将所有素数的列表返回到一定数量(如果是项目欧拉问题7,则为此)。我是Python的新手,但我的问题似乎不是语言,而是逻辑错误。

import math
import sys

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

def prime_counter(n):
    result = [2]
    while len(result) < n:
        for i in range(3, sys.maxsize, 2):
            if is_prime(i):
                result.append(i)
                break
    return result

print (prime_counter(6))

打印[2,3,3,3,3,3]。为什么不增加i并将新数字评估到列表中?为什么一直加3?

3 个答案:

答案 0 :(得分:3)

每次找到第一个素数(3)时,break语句都会在函数for中退出prime_counter循环。然后它从头开始重新启动for循环,从数字3开始,它再次发现是一个素数。

例如,你需要使用一个while循环并自己递增候选变量,然后在找到足够的素数时打破循环。

答案 1 :(得分:1)

摆脱while循环,相反,测试每个新发现的素数的var myText = txt_field.getText(); if(myText != null && myText.length > 15) { // do stuff } 的长度:

result

答案 2 :(得分:0)

您的休息声明似乎是个问题。在for循环的第一个循环中,设置i = 3,确认i小于sys.maxsize,然后检查i是否为素数。它是,所以我们做if语句的主体。它将i追加到您的结果集,然后突破for循环。请注意,我们永远不会回到for循环的顶部,在那里我将增加2.我们在3处离开。在断开for循环之后,我们检查while语句的条件,并确认长度为结果集仍然小于n,所以我们重新开始for循环,从3开始,检查3是否小于sys.maxsize等。你永远不会到处增加i。

而不是双循环,你应该只使用for循环,并在每次成功追加后,然后检查结果集的新长度是否等于n,如果是,则跳出循环。完全摆脱while循环。

祝你好运!