下面的程序正在查找给定范围内的素数。对于 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
我在那里做什么?
下面的程序正在查找给定范围内的素数。对于 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
我在那里做什么?
请参阅文档:
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)
[]
对于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)
基本上,您i
在非素数中逐步生成i
(任何倍数显然都是非素数)。i
在range(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]
顺便说一句,也可以在网上寻找更好的素数算法。这在算法上很差。
范围的三个参数由 ThiefMaster 解释。关于代码 - 代码对我来说看起来不错。唯一的问题似乎是print prime
线路。也许你应该添加
for prime in primes :
print prime