以下程序是在给定范围内查找素数。对于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
我在那做什么?
答案 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