除了小东西(未使用的布尔变量)之外,您的主要测试也非常低效。
让我们一步一步来。
首先:要测试一个数是否为素数,您不需要检查除数之前的所有整数。实际上,上升到sqrt(num) 就足够了。我们可以编写一个单行函数来判断一个数是否为素数,如下所示:
from numpy import sqrt
def is_prime(n):
return n > 1 and all(n%i for i in range(2,int(sqrt(n))+1))
range(2,some_num) 给出了一个遍历从 2 到 some_num-1 的所有数字的迭代器,并且 all() 函数检查语句 n%i 在该迭代器中的所有位置是否为真,并返回一个布尔值。如果您可以保证永远不会通过偶数,则可以从 3 开始范围(当然会失去一般性)。即使您不想使用该功能,将功能分离到不同的功能中也会更简洁,因为在您输入的数字循环中,您可能必须单独检查每个数字是否为素数。
第二:从这里,找到所有小于或等于输入的素数应该很容易。
num = int(input("Enter a number:"))
assert num>0, "Please provide a positive integer" # stops with an assertion error if num<=0
prime_lst = [2] if num > 1 else []
for x in range(3,num+1,2):
if is_prime(x):
prime_lst.append(x)
列表prime_lst 将包含您所追求的所有素数。我从 1 开始循环,这样我只能循环遍历奇数,偶数可以被 2 整除。所以这种方式没有一个数字可以被二整除。不幸的是,这需要我检查数字本身是否可能是 2,这是一个素数。根据双素数猜想,我们无法在不知道输入的情况下进一步简化这个范围。
最后:如果您真的想在一个循环中找到素数,请将您的循环更改为:
prime_lst = [2] if num > 1 else []
for x in range(3,num+1,2): # outer loop
for i in range(3,int(sqrt(x))+1): # inner loop for check if x is prime
if x%i == 0:
break # breaks the inner loop, number is not prime
else:
prime_lst.append(x)
编辑:刚刚看到第二个答案here 有一个很好的解释(并且是一种更好的方法)编写单行代码来找出一个数字是否是素数。