用于查找素数的Python函数

时间:2017-09-11 16:13:56

标签: python function

这不是关于查找素数,而是关于如何将代码转换为函数。

所以我有这些代码帮我打印2-100的素数:

pnumber = [x for x in range(2, 101) if all(x % i for i in range(2, x))]
print(pnumber)

如果我将其作为函数进行定义,则找到范围内的素数:

 def p_number(a, b):
     pnumber = [x for x in range(a, b+1) if all(x % i for i in range(2, b))]
     print(pnumber)

 p_number(2, 100)

您可以看到我使用a替换2,而b替换100,并相应地更改代码。但不知何故,这不会起作用,它会输出一个空列表。

我想知道为什么?

2 个答案:

答案 0 :(得分:2)

请注意,如果您在支票中使用上限 b

all(x % i for i in range(2, b))

这将包括最高b 的所有素数。因此235等也是range(2, b)的一部分(给定b足够大)。这意味着,如果我们测试3是否为素数,我们将检查i = 33 % 30,这样就会失败。

此外,它会对性能产生不良影响。主要测试的想法是检查所有数字,但排除数字。所以快速解决方法是:

def p_number(a, b):
    pnumber = [x for x in range(a, b+1) if all(x % i for i in range(2, x))]
    print(pnumber)

我们可以使用int(sqrt(x))+1代替x来轻松进一步提升它:

from math import sqrt

def p_number(a, b):
    pnumber = [x for x in range(a, b+1) if all(x % i for i in range(2, int(sqrt(x))+1))]
    print(pnumber)

我们可以进一步提升它,例如只计算奇数(并在结果中加2)。但是使用 sqrt 通常会导致显着的加速。

答案 1 :(得分:2)

将您的功能更改为 -

def p_number(a, b):
     pnumber = [x for x in range(a, b + 1) if all(x % i for i in range(a, x))]
     print(pnumber)

如果您注意到,您正在迭代i从2到b,而不是从2到x,这就是您获得空列表的原因。