Python for循环中的range理解

3
下面的程序在给定范围内查找质数。在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

而 i 在那里做什么?

5
第一步:你是否阅读了文档?文档很好。它解释了大多数类似这样的问题的答案。 - Chris Morgan
4个回答

17

查看文档

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

与在C语言中使用的for(..; ..; ..)循环进行比较时,它的三个参数用法如下:

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

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]

您可以指定range的其他参数,例如起始值、结束值和步长值。因此为 range(startval, endval, stepval)。请注意,生成的序列中endval包括在内的。

 range(0, 5, 1)

等同于

 range(5)

为了生成0到20之间的所有偶数,例如,您可以执行以下操作:
 range(0, 21, 2)

请注意,在 Python 3 之前,range 生成一个列表,而 xrange 则按需生成数字序列。

在你的特定代码中,使用了列表推导和 range。为了更清晰地理解算法和 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)

1
我在这里有同样的问题,关于downvote,你几乎说了所有的话。 - WY Hsu

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]

顺便在网上找一下更好的质数算法。这个算法在算法上非常差。


谢谢Praveen,我想了解列表推导和范围,现在已经清楚了,我会写一个更好的算法。 - Varun

0
关于range的三个参数,ThiefMaster已经进行了解释。至于代码-代码看起来对我来说还不错。唯一的问题似乎是print prime行。或许你应该添加


for prime in primes :
   print prime

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接