[英]Need insight on how to fix my Python prime number list generator
我是編程新手,為了練習學習 Python,我正在嘗試編寫一個程序,通過測試 num 是否可整除來測試(2, n-1)
范圍內的哪些數字是素數介於2
和sqrt(n)
之間。
在大多數情況下,素數列表非常准確,但由於某種原因,素數的平方 >= 11 使其通過循環。 循環的for i in range
部分應該將它們過濾掉。 我有一種感覺,這與我如何對if-statements
進行排序有關,或者可能與我如何縮進所有內容有關,但我不太明白。 任何幫助,將不勝感激!
我還意識到我可以繼續將num % 11 == 0
或num % 13 == 0
添加到第 7 行,但這有點違背了程序為我自動執行此操作的目的。
此外,我知道我可以找到一百萬個其他 Python 素數跳棋,但我試圖找出我在這里出錯的地方,以便我可以改進。 謝謝!!!
n = 362
prime = []
def prime_check(lst=range(2,n)):
for num in lst:
if num == 1 or num == 2 or num == 3 or num == 5 or num == 7:
prime.append(num)
if num % 2 == 0 or num % 3 == 0 or num % 5 == 0:
continue
for i in range(5, int(sqrt(n)+1), 2):
if num % i == 0:
continue
else:
prime.append(num)
print(prime)
import math
n = 362
prime = []
def prime_check(lst=range(2,n)):
for num in lst:
if num == 2 or num == 3 or num == 5 or num == 7:
prime.append(num)
continue
if num % 2 == 0 or num % 3 == 0 or num % 5 == 0:
continue
flag = 0
for i in range(5, int(math.sqrt(num)+1), 2):
if num % i == 0:
flag=1
break
if flag == 0:
prime.append(num)
return prime
print(prime_check())
你在邏輯上有一個問題。 該flag
確保素數僅添加一次。
注意:我也很困惑。 你寫的邏輯是錯誤的。 這就是為什么只有 11x11 的數字 121 進入素數列表的原因。 注2:關於else
部分,我之前寫錯了一部分。 (由於@Kelly Bundy而更正)
def prime_check(lst=range(2,n)):
for num in lst:
flag = 0
if num % 2 == 0:
continue
for i in range(3, int(math.sqrt(num)+1), 2):
if num % i == 0:
flag=1
break
if flag == 0:
prime.append(num)
return prime
注: 1
為非素數。
我之前的回答,甚至現在的當前答案,都避免了for-else
。 就個人而言,我明確地避免了它——使用這樣的句法結構不僅對我來說可讀性差,而且在大型代碼庫中理解這些東西的時間真的很困難。
幾點說明:
prime
和n
應該是 function 的局部變量,而不是內部引用的外部變量。math.sqrt
是一個 function 來計算平方根的精確浮點近似值。 但是我們在這里處理整數。 我們只關心平方根的 integer 部分。 有math.isqrt
的。flag
設置為 1 時您會立即跳出循環,然后您再也不會重用flag
,因此您根本不需要變量flag
。此外,您的問題可以分解為兩個不同的任務:
num
是否為質數;lst
以僅保留素數。 編程時,最好區分不同的任務,並為每個任務寫一個 function。 我會將您的代碼分解為兩個函數:一個 function is_prime
和一個 function filter_primes
。
import math
def is_prime(num):
if num < 2:
return False # negative numbers, 0, and 1, are not prime
for d in range(2, math.isqrt(num)+1):
if num % d == 0:
return False
return True
# OR ALTERNATIVELY
# def is_prime(num):
# return num >= 2 and not any(num % d == 0 for d in range(2, math.isqrt(num)+1))
def filter_primes(lst):
primes = []
for num in lst:
if is_prime(num):
primes.append(num)
return primes
# OR ALTERNATIVELY
# def filter_primes(lst):
# return list(filter(is_prime, lst))
print( filter_primes(range(362)) )
# [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41,
# 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97
# 01, 103, 107, 109, 113, 127, 131, 137, 139, 149,
# 151, 157, 163, 167, 173, 179, 181, 191, 193, 197,
# 199, 211, 223, 227, 229, 233, 239, 241, 251, 257,
# 263, 269, 271, 277, 281, 283, 293, 307, 311, 313,
# 317, 331, 337, 347, 349, 353, 359]
您應該使用正確的 root 並使用break
,而不是不一致地對待 7。
固定代碼( 在線嘗試! ):
from math import sqrt
n = 362
prime = []
def prime_check(lst=range(2,n)):
for num in lst:
if num == 1 or num == 2 or num == 3 or num == 5:
prime.append(num)
if num % 2 == 0 or num % 3 == 0 or num % 5 == 0:
continue
for i in range(5, int(sqrt(num)+1), 2):
if num % i == 0:
break
else:
prime.append(num)
print(prime)
prime_check()
Output:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.