了解python for循环中的范围

时间:2012-04-22 12:10:07

标签: python

以下程序是在给定范围内查找素数。对于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 个答案:

答案 0 :(得分:17)

请参阅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)
[]

答案 1 :(得分:5)

对于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]

您可以指定范围的其他参数,例如起始值,结束值以及stepvalue。所以range(startval, endval, stepval)。请注意,endval 包含在生成的序列中。

 range(0, 5, 1)

相当于

 range(5)

要生成0到20之间的所有偶数,例如

 range(0, 21, 2)

请注意,在Python 3 range生成列表之前,xrange会根据需要生成数字序列。

在您的特定代码中使用列表推导和范围。通过暂时消除列表理解以获得更清晰的想法,可能更容易理解算法和for循环的作用。 List comprehension是一个功能强大且高效的构造,如果您计划保留原始代码,则绝对应该使用它。

#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)

答案 2 :(得分:1)

基本上你在非素数中踩i来生成i的倍数(任何倍数显然都是非素数)。 i位于range(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]
BTW,也可以在线查看更好的素数算法。这个算法非常差。

答案 3 :(得分:0)

范围的三个参数由ThiefMaster解释。关于代码 - 代码对我来说没问题。唯一的问题似乎是print prime行。也许你应该添加

for prime in primes :
   print prime