2012-04-22 7 views
1

以下のプログラムは、与えられた範囲内の素数を見つけています。 noprimes list comprehension partのために、3つのパラメータが範囲内にあるのはなぜですか?Python for loopでの理解範囲

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 

ここで何をしていますか?

+5

ステップ1:ドキュメントをお読みください?ドキュメントは良いです。このようなほとんどの質問に対する答えを説明します。 –

答えて

15

the docs参照:

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

例えばfor(..; ..; ..)ループにそれを比較しますCで3つの引数は、次のように使用されています。

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

は、ドキュメントでは良い例でもあります。range()については

>>> 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) 
[] 
+2

+1は*ドキュメントを読む*。 –

4

は、基本的な考え方は、それはあなたのための項目のシーケンスを生成することです。参照http://docs.python.org/library/functions.html#rangeとしてこれを参照してください:ここ一方で

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

することは、いくつかの基本的な説明、最も簡単な例である:

range(5) 

は0(デフォルトの開始値)から始まる範囲内の数値を生成してまで行きますしかしない 5を含め、1(デフォルト値)の増加によって、あなたは追加のパラメータを指定することができますので、

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

sを開始値、終了値、およびステップ値などの範囲に設定します。だからrange(startval, endval, stepval)endvalは、生成されるシーケンスに含まれるではなく、であることに注意してください。

range(0, 5, 1) 

あなたが前のPython 3にrangeリストとxrangeを生成するインスタンス

range(0, 21, 2) 

注意のために行うことができ、0〜20の間のすべての偶数番号を生成する

range(5) 

に相当します要求に応じて番号シーケンスを生成します。

特定のコードでは、リスト内包表記と範囲を使用しています。範囲のある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) 
+0

私は2つのdownvotesの説明を取得できますか? – Levon

0

範囲の3つのパラメータはThiefMasterによって説明されました。コードについては、私には大丈夫です。唯一の問題はprint primeのようです。多分あなたは基本的に、あなたが(非プライム明らかに任意の倍数)iの倍数を生成する非素数iによってステッピングしている

for prime in primes : 
    print prime 
1

を追加する必要があります。 irange(2,8)にあります。[2, 3, 4, 5, 6, 7]であるため、50までの小数点では、sqrt(50)(約7)になるまで数値の倍数を削除するだけで済みます。

ネストされたリストの理解が混乱する場合は、わかりやすくするために、リストに分解してください。

>>> [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] 

また、より良い素数アルゴリズムについてオンラインで調べてみましょう。これはアルゴリズム的に非常に貧弱です。

+0

Praveenに感謝します。リストの理解と範囲を理解したかったのですが、今は明らかになっています。 – Varun