Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 理解嵌套列表理解的求值顺序_Python_List_Python 3.x_For Loop_Nested Loops - Fatal编程技术网

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

有帮助吗?把它们写成常规循环,你就能很容易地把它弄明白。好了,我现在明白了!!谢谢,谢谢