最近在网上看到这段代码:
nonprime = [j for i in range(2, 8) for j in range(i*2, 50, i)]
上面的代码似乎在计算所有小于 50 的非素数,但我不明白其中的逻辑。 我研究了 python 中的列表理解并观察到它使用过滤器根据条件进行过滤, 但我无法理解两个 for 循环是如何计算这些非素数的。
最佳答案
这个列表理解与这两个嵌套的 for 循环的作用相同:
nonprime=[]
for i in range(2,8):
for j in range(i*2, 50,i):
nonprime.append(j)
因此在外层循环中,i
在每次迭代中只增加 1,并取值 i=2,3,4,5,6,7。
j
上的内部 for 循环取决于外部循环。它从 2*i
开始,j
在每次迭代中增加 i
。
所以对于 ì=2
,内部循环从 j=4
开始并且 j
取值 j=4 ,6,8,...,48
。
然后 ì
在外循环中增加到 3 并且 j
取值 6,9,12,...48
请注意 nonprime
列表不会创建唯一元素,因为例如 6 出现不止一次。
正如 Bakuriu 正确指出的那样,此方法利用了 Sieve of Eratosthenes
关于python - 没有过滤器的列表理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50305446/