2012-04-22 74 views
1

下面的程序是在給定的範圍內查找素數。對於noprimes列表的理解部分,爲什麼我們有3個參數在範圍內?瞭解Python的循環範圍

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

第一步:您是否閱讀過文檔?文檔很好。它解釋了這樣的大多數問題的答案。 – 2012-04-22 12:40:51

回答

15

參見the docs

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

當相對於一個for(..; ..; ..)環例如在C三個參數都使用這樣的:

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

+1 *用於閱讀文檔*。 – 2012-04-22 12:40:11

4

對於range(),其基本思路是,它生成的項目爲您的序列。看到這個作爲參考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的範圍,如起始值,結束值和stepvalue。所以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) 
+0

請問我能否得到這兩個投票結果的解釋? – Levon 2012-04-22 12:21:55

0

範圍的三個參數由ThiefMaster解釋。關於代碼對我來說看起來沒問題。唯一的問題似乎是print prime系列。也許你應該添加

for prime in primes : 
    print prime 
1

基本上你被i非質數步進產生的i倍數(任何倍數顯然是一個非黃金)。 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 2012-04-22 12:25:51