Python 用列表理解测试素数

Python 用列表理解测试素数,python,list-comprehension,Python,List Comprehension,我试图用列表理解测试一个数字是否是质数。这是什么?我已经做了,但是没有得到想要的结果 number = 20 prime_number_test = [1 if number % i != 0 else 0 for i in range(2, 5)] output = [0,1,0] 数字20显然不是质数。现在如果我有一个已知的素数来测试,比如说19 number = 19 prime_number_test = [1 if number % i != 0 else 0 for i in ra

我试图用列表理解测试一个数字是否是质数。这是什么?我已经做了,但是没有得到想要的结果

number = 20
prime_number_test = [1 if number % i != 0 else 0 for i in range(2, 5)]
output = [0,1,0]
数字20显然不是质数。现在如果我有一个已知的素数来测试,比如说19

number = 19
prime_number_test = [1 if number % i != 0 else 0 for i in range(2, 5)]
output = [1,1,1]
现在我的问题是,为什么第一个代码不全是零,而
实现这一点的最佳方法是使用列表理解,我的结果告诉我这是一个素数

上面的代码显示了
[0,1,0]
,因为20不能被3整除,但可以被2和4整除。 19不能被2,3或4整除,因此它有输出
[1,1,1]
你可以说,如果输出中有0,那么这个数字就不是素数

可以使用以下程序查找素数

num = int(input("Enter a number: "))  
  
if num > 1:  
   for i in range(2,num):  
       if (num % i) == 0:  
           print(num,"is not a prime number")  
           print(i,"times",num//i,"is",num)  
           break  
   else:  
       print(num,"is a prime number")  
         
else:  
   print(num,"is not a prime number")  

您的理解将为您提供一个值列表,您可以使用
任意
函数。例如,这里获得
True
False
值的列表:

number = 20
upper_limit = int(number ** 0.5)  # square root
prime_number_test = not any([number % i == 0 for i in range(2, 1 + upper_limit)])
print(prime_number_test)
您理解后返回的列表为:

[True, False, True]
对应于除以2、3和4

然后
any
返回
True
,而
not
则否定:20不是素数,因为它可以被2和4整除

在这里,您还可以反转测试并执行以下操作:

prime_number_test = all([number % i != 0 for i in range(2, 1 + upper_limit)])
注意
=
全部

但是,在这两种情况下,如果将方括号替换为括号,则效率更高(在时间和内存方面):

prime_number_test = not any((number % i == 0 for i in range(2, 1 + upper_limit)))
这个外观类似的表达式使用了,它不会建立一个列表,而是根据需要生成值,
any
将根据需要进行迭代,并在找到第一个匹配项时停止


(当使用生成器作为函数的唯一参数时,如此处所示,也允许省略外圆括号。)

显然,
20%3=0
。这就是为什么第一个输出不都是0。列表理解不是检查素数的好方法。您希望在找到第一个数字后立即停止检查,但列表理解必须测试每个数字。我希望新编辑的解决方案将为您提供完整的帮助谢谢您的解释。这显然有所帮助。Stack社区是最好的。谢谢大家。