簡體   English   中英

需要深入了解如何修復我的 Python 素數列表生成器

[英]Need insight on how to fix my Python prime number list generator

我是編程新手,為了練習學習 Python,我正在嘗試編寫一個程序,通過測試 num 是否可整除來測試(2, n-1)范圍內的哪些數字是素數介於2sqrt(n)之間。

在大多數情況下,素數列表非常准確,但由於某種原因,素數的平方 >= 11 使其通過循環。 循環的for i in range部分應該將它們過濾掉。 我有一種感覺,這與我如何對if-statements進行排序有關,或者可能與我如何縮進所有內容有關,但我不太明白。 任何幫助,將不勝感激!

我還意識到我可以繼續將num % 11 == 0num % 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 就個人而言,我明確地避免了它——使用這樣的句法結構不僅對我來說可讀性差,而且在大型代碼庫中理解這些東西的時間真的很困難。

幾點說明:

  • 1不是素數。
  • 我真的沒有看到在您的代碼中為 2,3,5,7 設置特殊情況的充分理由。
  • primen應該是 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.

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