Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我的破译代码[Python初学者]在哪里_Python - Fatal编程技术网

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

我的破译代码[Python初学者]在哪里,python,Python,我试图返回一个包含所有素数的列表,最大值为某个数字(这是针对Project Euler问题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

我试图返回一个包含所有素数的列表,最大值为某个数字(这是针对Project Euler问题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))
导入数学
导入系统
def是_prime(n):
如果n%2==0:
返回错误
对于范围(3,int(math.sqrt(n))+1,2)内的i:
如果n%i==0:
返回错误
返回真值
def prime_计数器(n):
结果=[2]
而len(结果)

这将打印[2,3,3,3,3]。为什么不增加i并计算列表中的新数字?为什么它一直添加3?

摆脱while循环,而是测试每个新发现的素数的
结果的长度:

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

每当
break
语句找到第一个素数(3)时,它就会退出函数
prime\u计数器中的
for
循环。然后它从头开始重新启动
for
循环,从数字3开始,它再次发现该数字是素数


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

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

与双循环不同,您应该只使用for循环,在每次成功追加后,检查结果集的新长度是否等于n,如果是,则中断循环。完全摆脱while循环


祝你好运

你从不增加
i
,你只会打破
循环。你应该加一个计数器somewhere@BillLynch-谢谢你的编辑。我刚才注意到了,但你在我还没来得及修好之前就修好了。