在变量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]
答案 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个,并且那里没有包含的所有内容都是素数。