2

下面的程序正在查找给定范围内的素数。对于 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

4 回答 4

17

请参阅文档

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)
[]
于 2012-04-22T12:11:47.100 回答
5

对于range(),基本思想是它为您生成一系列项目。将此视为参考http://docs.python.org/library/functions.html#range

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

同时这里有一些基本的解释,最简单的例子:

 range(5)

将生成从 0(默认起始值​​)开始的范围内的数字,并以 1(默认值)为增量上升到但包括 5,因此

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

您可以为范围指定其他参数,例如起始值、结束值以及步长值。所以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)
于 2012-04-22T12:12:26.110 回答
1

基本上,您i非素数中逐步生成i(任何倍数显然都是非素数)。irange(2,8)ie中[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]

顺便说一句,也可以在网上寻找更好的素数算法。这在算法上很差。

于 2012-04-22T12:22:17.063 回答
0

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

for prime in primes :
   print prime
于 2012-04-22T12:17:00.517 回答