[英]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。 例如,這里獲得了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)])
注意!=
和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.