所有大于 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