关于列表推导式和生成器表达式?
求助各位大侠?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()函数的每一行?
你没有遍历 res1 。列表推导式会先计算每个值,而生成器推导式不会 列表推导式会直接执行gen_AB的每一行语句,所以就有了
start
continue
end.
start
continue
end.
>>> res1
['AAA', 'BBB']
而生成器是惰性的,只有在调用(遍历)时才执行。 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]