0

私は始めたばかりで、次のコードを書き、数時間デバッグしようとしています。私はここで非常に基本的なものを得ていません。call パラメーターで指定された長さまでの素数のリストをコードで取得したいと考えています。作業を進めてコーディングを容易にするために、最初の 4 つのリストから始めました。私が使用したい基本的なアルゴリズムは、リストの最後のメンバーに 2 を追加し、リストの他のメンバーが最初のメンバーから始めてリストを分割するかどうかを判断することにより、リストの最後の数字が素数であるかどうかを確認することです。除数の値が候補素数の平方根を超えた時点でチェックを停止したいのですが、それを試みる方法さえわかりません。

5 行目でエラーが発生していますが、これは理解できませんが、コードには他にも問題があると確信しています。

def prime_list(length):
    L = [2, 3, 5, 7]
    j = 9

    while length > len(L):
        prime = True
        i = 0
        for divisor in L:
            while divisor in range (0, len(L) - 2) and prime == True:
                if j % divisor == 0:
                    prime = False
        if prime == False:
            j = j + 2
        else:
            L = L.append(j)
    return L
4

6 に答える 6

1

あなたの問題はここにあると確信しています:

L = L.append(j)

そうL.append(j)すれLば、あなたが望むリストになります。

Lメソッドの戻り値に設定していますがappend()、これはおそらく何もありません。

はい、コード内のロジックに他の問題があるかもしれませんが、それを維持してください!

私の前に他の人がこの答えにたどり着いたので、私がどのようにそれを理解したかを説明します。 len(L)リストであると定義Lしたので、うまくいくはずです。while ループでこれがいつ発生するかを確認したかったのでprint()、ループの開始直後に次のように挿入しました。

while length > len(L):
    print('check')
    prime = True
    ...

「check」は 1 回だけ出力されるため、ループが 1 回実行された後、このエラーが発生します。Lそのため、ループ内で変更している場所を探すようになりました。ステートメントは際立っていましたappend()が、エラーは理にかなっています: TypeError: object of type 'NoneType' has no len(). その行で無意識のうちに に設定LNoneます。

PS:print()はいつでもデバッグの味方です

于 2013-05-19T18:48:10.847 に答える
0

2 を超える偶数はすべて素数ではありません。2 で割ることができるからです。したがって、次のように 3 を超える奇数のリストを作成できます。

def prime_list(length):
    candidates = list(range(3, length, 2))

lenth=17 の例

In [1]: length = 17

In [2]: list(range(3, length, 2))
Out[2]: [3, 5, 7, 9, 11, 13, 15]

ここで、そのリストのすべての数値 N について、前の数値の 1 つを法とする N がゼロでないことを確認する必要があります。これは、all関数とリスト内包表記で行うことができます。

    L = []
    for c in candidates:
        if all([c % p != 0 for p in range(2,c)]):
            L.append(c)

たとえば、数字の 39 でこれを試してみましょう。

In [1]: [39 % p != 0 for p in range(2,39)]
Out[1]: [True, False, True, True, True, True, True, True, True, True, True, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True]

39 % 3 = 0 なので、リストの 2 番目の項目は false です。つまり、39 は素数ではありません。リストに1 つ以上のFalse値がある場合は、 all()false を返します。

In [3]: all([39 % p != 0 for p in range(2,39)])
Out[3]: False

2 番目の例は 17 です。

In [3]: [17 % p != 0 for p in range(2,17)]
Out[3]: [True, True, True, True, True, True, True, True, True, True, True, True, True, True, True]

In [4]: all([17 % p != 0 for p in range(2,17)])
Out[4]: True

つまり、17 は素数です。

リスト L には 1 と 2 を除く素数が含まれているため、関数は次のように完成します。

def prime_list(length):
    candidates = list(range(3, length, 2))
    L = []
    for c in candidates:
        if all([c % p != 0 for p in range(2,c)]):
            L.append(c)
    return [1, 2] + L

for ループをリスト内包表記に置き換えて、関数を 3 行のコードにまとめることができます。

def prime_list(length):
    candidates = list(range(3, length, 2))
    L = [c for c in candidates if all(c % p != 0 for p in range(2,c))]
    return [1,2] + L
于 2013-05-19T19:52:03.897 に答える