0

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

我在第 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
4

6 回答 6

1

.append()在 return 处修改列表None。不要将None它返回给L.

于 2013-05-19T18:46:49.793 回答
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(). 你在不知不觉中设置LNone那一行。

PS:print()永远是你调试的朋友

于 2013-05-19T18:48:10.847 回答
0

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

于 2013-05-19T18:46:43.847 回答
0

如果不是除数,您的while循环将永远持续:j

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

L.append(j)返回None,所以你设置LNone一旦你追加到它。

看看别人是怎么做的可能会有所帮助。我会这样写:

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
于 2013-05-19T18:47:08.110 回答
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/

于 2013-05-19T18:40:56.840 回答
0

所有大于 2 的偶数都不是素数,因为您可以将它们除以 2。因此您可以创建一个 >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
于 2013-05-19T19:52:03.897 回答