簡體   English   中英

用列表理解測試素數

[英]testing for prime number with 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 range(2, 5)]
output = [1,1,1]

現在我的問題是,為什么第一個代碼不是全為零,以及使用列表理解實現這一點的最佳方法是什么,我的結果告訴我這是一個素數

上面的代碼顯示[0,1,0]因為 20 不能被 3 整除,但可以被 2 和 4 整除。19 不能被 2,3 或 4 整除,因此它具有 output [1,1,1]你可以說如果 output 中有 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")  

你的理解會給你一個值列表,你可以使用any function。 例如,這里獲得了TrueFalse值的列表:

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)])

注意!=all

但是,無論哪種情況,如果用括號替換方括號,效率會更高(在時間和內存上):

prime_number_test = not any((number % i == 0 for i in range(2, 1 + upper_limit)))

這個看起來相似的表達式使用了一個生成器,而不是構建一個列表,它將按需生成值,並且any將導致它根據需要進行迭代並在找到第一個匹配項時停止。

(當使用生成器作為 function 的唯一參數時,也可以省略外括號。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM