Python 理解嵌套列表理解的求值顺序
我正在准备考试,我决定开始解决过去的考试。其中一个要求是理解代码的功能。但是我对这个注释有困难 我不明白这个嵌套循环的结构是什么,哪个循环是先执行的Python 理解嵌套列表理解的求值顺序,python,list,python-3.x,for-loop,nested-loops,Python,List,Python 3.x,For Loop,Nested Loops,我正在准备考试,我决定开始解决过去的考试。其中一个要求是理解代码的功能。但是我对这个注释有困难 我不明白这个嵌套循环的结构是什么,哪个循环是先执行的 n = 10 p = [q for q in range(2, n) if q not in [r for i in range(2, int(n**0.5)) for r in range(i * 2, n, i)]] print(p) 有人能帮我理解吗?首先要评估: [r for i in range(2, int(n**0.5)) for
n = 10
p = [q for q in range(2, n) if q not in [r for i in range(2, int(n**0.5)) for r in range(i * 2, n, i)]]
print(p)
有人能帮我理解吗?首先要评估:
[r for i in range(2, int(n**0.5)) for r in range(i * 2, n, i)]
这可以归结为:
[r for r in range(4, 10, 2)]
由于范围(2,int(n*0.5))
减少为一个列表,其中包含一个元素[2]
,该元素在中用作范围(i*2,n,i)
语句中r的i
值。因此,内部列表理解的计算结果为[4,6,8]
然后,执行范围(2,n)中q的外部循环,并返回列表[2,3,…,9]
中不属于先前构造的列表的元素,即[4,6,8]
:
# range(2, n) -> [2, 3, ..., 9]
q for q in range(2, n) if q not in [..previously constructed list]
根据经验,最里面的循环将首先执行
n = 10
p = [q for q in range(2, n) if q not in [r for i in range(2, int(n**0.5)) for r in range(i * 2, n, i)]]
print(p)
考虑到这一点,让我们将问题分解:
[r for i in range(2, int(n**0.5)) for r in range(i * 2, n, i)]
n**0.5
是3.xxx,因此范围(2,int(n**0.5))
实际上是范围(2,3),即2(有关更多信息,请参阅)
所以无论怎样,i
都将是2
r在范围内(i*2,n,i)
现在看起来很简单,r将在4到10之间(不包括),使用步骤2。可能的值为4、6和8
问题是:
p = [q for q in range(2, n) if q not in [4, 6, 8]]
基本上都是2到10之间的奇数(不包括),加上数字2。如果您很难理解内部循环,请运行以下代码:
resultA = []
for x in ['x1', 'x2', 'x3']:
for y in ['y1', 'y2', 'y3']:
for z in ['z1', 'z2', 'z3']:
resultA.append(''.join([x, y, z]))
print resultA
resultB = [''.join([x, y, z])
for x in ['x1', 'x2', 'x3']
for y in ['y1', 'y2', 'y3']
for z in ['z1', 'z2', 'z3']
]
print resultB
print resultA == resultB
一旦你理解了这些代码,理解列表就成了你的第二天性,然后回到你的原始代码,你就不会有任何问题了:)这相当于:
list_i=[]
for i in range(2, int(n**0.5)):
for r in range(i*2, n, i):
list_i.append(r)
res=[]
for q in range(2, n) :
if q not in list_i:
res.append(q)
print res
有帮助吗?把它们写成常规循环,你就能很容易地把它弄明白。好了,我现在明白了!!谢谢,谢谢