这不是关于查找素数,而是关于如何将代码转换为函数。
所以我有这些代码帮我打印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,并相应地更改代码。但不知何故,这不会起作用,它会输出一个空列表。
我想知道为什么?
答案 0 :(得分:2)
请注意,如果您在支票中使用上限 b
:
all(x % i for i in range(2, b))
这将包括最高b
的所有素数。因此2
,3
,5
等也是range(2, b)
的一部分(给定b
足够大)。这意味着,如果我们测试3
是否为素数,我们将检查i = 3
,3 % 3
是0
,这样就会失败。
此外,它会对性能产生不良影响。主要测试的想法是检查所有数字,但排除数字。所以快速解决方法是:
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,这就是您获得空列表的原因。