2

以下のプログラムは、指定された範囲で素数を見つけています。noprimes リスト内包表記の部分で、範囲内に 3 つのパラメーターがあるのはなぜですか?

noprimes = [j for i in range(2, 8) for j in range(i*2, 50, i)]
primes = [x for x in range(2, 50) if x not in noprimes]
print prime

私はそこで何をしているの?

4

4 に答える 4

17

ドキュメントを参照してください:

range([start], stop[, step])

for(..; ..; ..)これをループと比較する場合、たとえば C では、3 つの引数は次のように使用されます。

for(int i = start; i != stop; i += step)

ドキュメントにも良い例があります:

>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(1, 11)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> range(0, 30, 5)
[0, 5, 10, 15, 20, 25]
>>> range(0, 10, 3)
[0, 3, 6, 9]
>>> range(0, -10, -1)
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
>>> range(0)
[]
>>> range(1, 0)
[]
于 2012-04-22T12:11:47.100 に答える
5

の場合range()、基本的な考え方は、アイテムのシーケンスを生成することです。これを参照http://docs.python.org/library/functions.html#rangeとして参照してください。

 format: range([start], stop[, step])

それまでの間、いくつかの基本的な説明、最も簡単な例を次に示します。

 range(5)

は、0 (デフォルトの開始値) から1 (デフォルト値) ずつ 5 までの範囲の数値を生成します。したがって

 In [1]: range(5)
 Out[1]: [0, 1, 2, 3, 4]

開始値、終了値、ステップ値など、範囲に追加のパラメーターを指定できます。だからrange(startval, endval, stepval)。が生成されるシーケンスに含まれてendvalないことに注意してください。

 range(0, 5, 1)

と同等です

 range(5)

たとえば、0 から 20 までのすべての偶数を生成するには、次のようにします。

 range(0, 21, 2)

Python 3 より前でrangeは、リストがxrange生成され、オンデマンドで番号シーケンスが生成されることに注意してください。

特定のコードでは、リスト内包表記と範囲を使用しています。より明確なアイデアを得るために一時的にリスト内包表記を削除することで、アルゴリズムと for ループの役割を理解しやすくなる場合があります。リスト内包表記は強力で効率的な構成要素であり、元のコードを保持する予定がある場合は必ず使用する必要があります。

#noprimes = [j for i in range(2, 8) for j in range(i*2, 50, i)]
noprimes = []
for i in range (2, 8):
   for j in range (i*2, 50, i):
      noprimes.append(j)

# primes = [x for x in range(2, 50) if x not in noprimes]
primes = []
for x in range(2, 50):
   if x not in noprimes:
      primes.append(x)
于 2012-04-22T12:12:26.110 に答える
1

基本的にi非素数に足を踏み入れて倍数を生成していますi(明らかに非素数の倍数)。iつまり、素数が 50 までの場合は、(およそ) 7 になるまでの倍数を削除するだけでrange(2,8)よいためです。[2, 3, 4, 5, 6, 7]sqrt(50)

ネストされたリスト内包表記がわかりにくい場合は、理解を容易にするためにステップに分解してみてください。

>>> [j for i in [2] for j in range(i*2, 50, i)]
[4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48]
>>> [j for i in [3] for j in range(i*2, 50, i)]
[6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48]

ところで、より良い素数アルゴリズムについては、オンラインでも調べてください。これはアルゴリズム的に非常に貧弱です。

于 2012-04-22T12:22:17.063 に答える
0

範囲の 3 つのパラメーターは ThiefMaster によって説明されました。コードについて - コードは私には問題ないようです。唯一の問題はprint primeラインのようです。多分あなたは追加する必要があります

for prime in primes :
   print prime
于 2012-04-22T12:17:00.517 に答える