请详细说明以下程序

时间:2017-07-17 11:02:36

标签: python

在变量noprimes中,在i循环中声明第二个j有什么用?是从第一个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]

1 个答案:

答案 0 :(得分:2)

将其视为双C# statements循环。如果你这样读它可能会更容易理解:

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) 为2,因此i运行j范围。结果,它产生的数字(range(4, 50, 2) s)如下:

j

在下一次迭代中,j = [4, 6, ..., 48] 和新的i = 3是:

j

依此类推j = [6, 9, ..., 48] 。最后,您将所有这些i = 7放在一起创建j noprimes

这只是Eratosthenes Sieve的实现。它收集的所有倍数(最多7个)最多50个,并且那里没有包含的所有内容都是素数。