1. 程式人生 > 其它 >Python--生成器表示式的巢狀 g = (n for n in ls if n in ls)

Python--生成器表示式的巢狀 g = (n for n in ls if n in ls)

我們知道,Python的生成式表示式是這樣的:

generator_1 = (i for i in range(10))

如果我將生成式表示式進行巢狀,然後再使用這個生成器的時候做點小動作:

ls = [1, 2, 3, 4, 5]
g = (n for n in ls if n in ls)
ls = [0, 1, 2]
result = list(g)
點選檢視結果
[1, 2]

結果解析:Python從2.4開始就對生成器巢狀做了一些規定,我們查詢 PEP 289 – Generator Expressions
有這麼一個規定:

Only the outermost for-expression is evaluated immediately, the other expressions are deferred until the generator is run:

g = (tgtexp  for var1 in exp1 if exp2 for var2 in exp3 if exp4)
is equivalent to:
def __gen(bound_exp):
    for var1 in bound_exp:
        if exp2:
            for var2 in exp3:
                if exp4:
                    yield tgtexp
g = __gen(iter(exp1))
del __gen

也就是說:

只有最外層的forloop迴圈才會在生成生成器的時候就立即計算,而其他的只會在生成器執行時候再計算執行
所以結果就很明顯了,g = (n for n in ls if n in ls)

for n in ls在生成器產生時候就會計算執行,此時ls = [1, 2, 3, 4, 5]
而最後在使用這個生成器g的時候,ls = [0, 1, 2],後面的if n in lsls就是最後的[0, 1, 2]