aaronduan 发表于 2020-5-7 16:12:19

关于列表推导式和生成器表达式?

求助各位大侠?
def gen_AB():
        print('start')
        yield 'A'
        print('continue')
        yield 'B'
        print('end.')

>>> res1 =
start
continue
end.
为何结果是
start
continue
end.


而res2 = (x*3 for x in gen_AB())
>>> for i in res2:
        print(i)
       
start
AAA
continue
BBB
end.
而使用生成器推导式的时候是从执行gen_AB()函数的每一行?



       

zltzlt 发表于 2020-5-7 16:20:10

你没有遍历 res1 。列表推导式会先计算每个值,而生成器推导式不会

冬雪雪冬 发表于 2020-5-7 16:46:06

列表推导式会直接执行gen_AB的每一行语句,所以就有了
start
continue
end.
start
continue
end.
>>> res1
['AAA', 'BBB']
而生成器是惰性的,只有在调用(遍历)时才执行。

sunrise085 发表于 2020-5-7 16:52:10

res1 =    这种写法是列表推导式,会直接推导一遍,得到对应的值放在列表res1中,因此直接运行就得到了以下结果
start
continue
end.
res2 = (x*3 for x in gen_AB()) 是生成器推导式,不会进行计算,只有遍历该生成器的时候才会计算,
也就是说运行以下代码的时候才会进行计算for i in res2:
    print(i)
第一次循环,执行print('start'),然后得到i='AAA'执行print(i)
第二次循环,执行print('continue'),然后得到i='BBB'执行print(i)
第三次循环,执行print('end.'),这次没有得到i,不执行print(i)
最终得到结果是
start
AAA
continue
BBB
end.
页: [1]
查看完整版本: 关于列表推导式和生成器表达式?