鱼C论坛

 找回密码
 立即注册
查看: 673|回复: 3

[已解决]关于列表推导式和生成器表达式?

[复制链接]
发表于 2020-5-7 16:12:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

>>> res1 = [x*3 for x in gen_AB()]
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()函数的每一行?



       
最佳答案
2020-5-7 16:52:10
res1 = [x*3 for x in gen_AB()]   这种写法是列表推导式,会直接推导一遍,得到对应的值放在列表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.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-7 16:20:10 | 显示全部楼层
你没有遍历 res1 。列表推导式会先计算每个值,而生成器推导式不会
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-7 16:46:06 | 显示全部楼层
列表推导式会直接执行gen_AB的每一行语句,所以就有了
start
continue
end.
start
continue
end.
>>> res1
['AAA', 'BBB']
而生成器是惰性的,只有在调用(遍历)时才执行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-7 16:52:10 | 显示全部楼层    本楼为最佳答案   
res1 = [x*3 for x in gen_AB()]   这种写法是列表推导式,会直接推导一遍,得到对应的值放在列表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.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-27 05:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表