2012-04-22 91 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