生成素数列表。 - 初学者

时间:2013-05-19 18:37:16

标签: python python-3.x

我刚刚开始,我已经编写了以下代码并且已经尝试调试它几个小时。我在这里没有得到一些非常基本的东西。我希望代码能够给出一个在call参数中指定的最长为素数的素数列表。我开始列出前四个列表,只是为了让事情顺利进行并使编码更容易。我想要使​​用的基本算法是向列表的最后一个成员添加两个,然后通过确定列表的其他成员是否将其除以来检查列表中的最后一个数字是否为素数,从第一个成员开始。我想在除数的值超过候选素数的平方根时停止检查,但我还没弄明白如何尝试它。

我在第5行收到错误,我无法理解,但我也确定代码还有其他问题。

def prime_list(length):
    L = [2, 3, 5, 7]
    j = 9

    while length > len(L):
        prime = True
        i = 0
        for divisor in L:
            while divisor in range (0, len(L) - 2) and prime == True:
                if j % divisor == 0:
                    prime = False
        if prime == False:
            j = j + 2
        else:
            L = L.append(j)
    return L

6 个答案:

答案 0 :(得分:1)

.append()修改了返回None的列表。请勿指定返回None的{​​{1}}。

答案 1 :(得分:1)

我很确定你的问题在这里:

L = L.append(j)

只需执行L.append(j),然后L将成为您希望的列表。

您将L设置为append()方法的返回值,这可能不算什么。

是的,您的代码中的逻辑可能还有其他一些问题,但请继续关注!

由于其他人在我之前得到了这个答案,我会向你解释我是如何弄明白的。 len(L)应该有效,因为您将L定义为列表。我想看看在while循环中发生了什么,所以我在循环开始之后插入print(),如下所示:

while length > len(L):
    print('check')
    prime = True
    ...

它只打印一次“检查”,这意味着循环运行一次然后你得到这个错误。这导致我寻找你在循环中修改L的位置。 append()语句脱颖而出,然后错误才有意义:TypeError: object of type 'NoneType' has no len()。您在不知不觉中将L设置为该行中的None

P.S。:print()始终是您调试的朋友

答案 2 :(得分:0)

如果length > len(L)失败,则很可能是类型问题。你正在比较字符串和整数。

range (0, len(L) - 2):你能确保len(L) - 2大于或等于0吗?

看看这个生成器:http://code.activestate.com/recipes/366178-a-fast-prime-number-list-generator/

答案 3 :(得分:0)

声明L = L.append(j)没有您期望的效果。请仔细检查手册。

答案 4 :(得分:0)

如果while不是除数,那么j循环会永远继续:

while divisor in range (0, len(L) - 2) and prime == True:

L.append(j)会返回None,因此,一旦您附加L,就会将None设置为def prime_list(num): # Start off with the first two primes primes = [2, 3] # The test number is the last prime + 2 n = primes[-1] + 2 while len(primes) < num: # For every prime smaller than n for prime in primes: # If the prime divides n if n % prime == 0: # n isn't prime. Break out of the loop. break else: # We didn't break out of the loop, so n is prime primes.append(n) # Add 2 to the test number n += 2 return primes

了解其他人如何做到这一点可能会有所帮助。我会这样写:

{{1}}

答案 5 :(得分:0)

所有偶数&gt; 2不是素数,因为你可以将它们除以2.所以你可以创建一个奇数列表&gt;这样的3个数字:

def prime_list(length):
    candidates = list(range(3, length, 2))

lenth = 17

的示例
In [1]: length = 17

In [2]: list(range(3, length, 2))
Out[2]: [3, 5, 7, 9, 11, 13, 15]

现在,对于该列表中的所有数字N,您需要验证N个模数中的一个是否为非零。这可以使用all函数和列表解析来完成:

    L = []
    for c in candidates:
        if all([c % p != 0 for p in range(2,c)]):
            L.append(c)

让我们尝试一下,例如数字39:

In [1]: [39 % p != 0 for p in range(2,39)]
Out[1]: [True, False, True, True, True, True, True, True, True, True, True, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True]

列表中的第二项是假的,因为39%3 = 0.所以39不是素数。 如果列表中有一个或多个False值,all()将返回false:

In [3]: all([39 % p != 0 for p in range(2,39)])
Out[3]: False

第二个例子是数字17:

In [3]: [17 % p != 0 for p in range(2,17)]
Out[3]: [True, True, True, True, True, True, True, True, True, True, True, True, True, True, True]

In [4]: all([17 % p != 0 for p in range(2,17)])
Out[4]: True

所以17是素数。

列表L现在包含素数,但1和2除外,因此完成函数:

def prime_list(length):
    candidates = list(range(3, length, 2))
    L = []
    for c in candidates:
        if all([c % p != 0 for p in range(2,c)]):
            L.append(c)
    return [1, 2] + L

你甚至可以将for循环替换为列表理解,将函数简化为三行代码:

def prime_list(length):
    candidates = list(range(3, length, 2))
    L = [c for c in candidates if all(c % p != 0 for p in range(2,c))]
    return [1,2] + L