你熟悉 Python 中的 yield 关键字吗?
你知道列表推导式与生成器推导式的区别吗?
它们有什么使用场景?
假设有以下文本文件:
你会怎么做?
一次把所有行读取下来,然后遍历过滤?
如果文件有100万行呢?
如果我们把文件看作是一个仓库,里面每一行是货物。
你是零售商,此时有消费者找你买东西(那些"目标"开头的货物)
你有两种方式。
方式1:
辛不辛苦不知道,但是占空间是肯定,应该没有谁会这么干吧
方式2:
此时解决了占家里空间的问题,但是你需要亲自跑到仓库做事情(代码表现是你的判断逻辑全混合到读取文件逻辑中)
有没有改进空间?
关键问题是:
很简单:
但是,这方式代码实在不直观,特别对比方式1:
如果可以这样子就完美了:
其实,在上一种方式上简单修改即可:
此时,如果我们简单调用这个函数,会得到什么?
此时,这个函数叫做生成器(generator)。
注意,此时他根本不会加载数据,也就是说,这个函数里面的代码根本没有执行
它就像仓库管理员,现在你不需要亲自走进仓库里面:
这里重点是叫他准备一次,他只能遍历一次:
优点:
需求升级一下:
在之前需求基础下,把目标数值大于95的货物取出来
想象一下,目标数量可能是200万,上面的代码行1变量 res 是一个列表,但数值大于95的可能只有几行。
我们好像又遇到了之前的空间问题
上一种方式得到的是列表,是因为我们使用了列表推导式,我们只需要简单把最外层的方括号改为括号,推导式就会变成生成器:
这里用到解包,可以回看以前的解包教学视频:
你学会了没有?
记得点赞,转发!谢谢支持!
推荐阅读: