2017-07-17 67 views
-4

在变量noprimes声明第二个ij循环中有什么用?它是从第一个i循环取值还是参考i值?它请详细说明下面的程序

>>> 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 primes 
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47] 
+0

把它想象成一个双'for'循环。如果你这样读它,可能会比较容易理解:'[范围(2,8)]中的[j代表范围内(i * 2,50,i)]'。请注意,这是Python无效的想法! –

回答

2

觉得作为一个双for循环。

[j for j in range(i*2, 50, i) for i in range(2, 8)] # **Not valid Python!** 

或本:

noprimes = [] 
for i in range(2, 8): 
    for j in range(2 * i, 50, i): 
     noprimes.append(j) 

在第一个外循环迭代,i为2,因此j运行range(4, 50, 2)范围,如果你喜欢这个读它可能更容易理解。其结果是,它产生的数字(j S)如下:

j = [4, 6, ..., 48] 

在下一次迭代中,i = 3和新j s为:

j = [6, 9, ..., 48] 

依此类推,直至i = 7。最后,您将所有这些j s一起创建为noprimeslist

这只是Eratosthenes Sieve的执行。它收集所有(数字高达7)的倍数高达50,并且没有包括在内的所有东西都是素数。

相关问题