python 生成器需注意的小问题


Posted in Python onSeptember 29, 2020

在Python中,生成器和函数很像,都是在运行的过程中才会去确定各种变量的值,所以在很多情况下,会导致各种各样的问题。

def generator_test1():
 # 0...9 generator
 x = (i for i in range(10))
 # 5..9 generator
 x_filter = filter(lambda y: y >= 5, x)
 # first use the x
 L = list(x)
 print("L, x", L)
 # then use x_filter
 l = list(x_filter)
 print("l, x_filter", l)
 
 
if __name__ == "__main__":
 generator_test1()

输出结果为:

L, x [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
l, x_filter []

上述代码中,x_filter是基于生成器x构建的生成器,但是由于x在x_filter使用之前先被用掉了,所以在使用x_filter的时候,才去获取x的值,而此时x已经用完了,最终导致x_filter转化成的列表是空的。

def generator_test2():
 x = (i for i in range(10))
 for i in range(10):
  x = (j + i for j in x)
 L = list(x)
 print("L, x", L)
 
if __name__ == "__main__":
 generator_test2()

输出结果:

L, x [90, 91, 92, 93, 94, 95, 96, 97, 98, 99] 

上述代码中,每次循环都基于原先的生成器构建一个新的生成器,由于并未使用,所以生成器x中的i并没有被赋值。在后面转化成列表的时候才去获取i的值,而此时由于i为9,所以所有的生成器x的i都为9,原始的x是0到9的生成器,接下来的10个生成器每个都在原始值上加9,导致每个值都增大了90。下面是此例的一个变体:

def generator_test3():
 x = (i for i in range(10))
 for i in range(10):
  x = (j + i for j in x)
 i = 20
 L = list(x)
 print("L, x", L)
 
if __name__ == "__main__":
 generator_test3()

输出结果:

L, x [200, 201, 202, 203, 204, 205, 206, 207, 208, 209]

以上就是python 生成器需注意的小问题的详细内容,更多关于python 生成器的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python 代码性能优化技巧分享
Aug 07 Python
python创建和删除目录的方法
Apr 29 Python
python构建自定义回调函数详解
Jun 20 Python
python生成随机图形验证码详解
Nov 08 Python
解读! Python在人工智能中的作用
Nov 14 Python
Python实现PS滤镜特效Marble Filter玻璃条纹扭曲效果示例
Jan 29 Python
python实现将读入的多维list转为一维list的方法
Jun 28 Python
django 中的聚合函数,分组函数,F 查询,Q查询
Jul 25 Python
python将print输出的信息保留到日志文件中
Sep 27 Python
python 制作python包,封装成可用模块教程
Jul 13 Python
python re的findall和finditer的区别详解
Nov 15 Python
字典算法实现及操作 --python(实用)
Mar 31 Python
python 两种方法删除空文件夹
Sep 29 #Python
如何使用python写截屏小工具
Sep 29 #Python
python如何调用百度识图api
Sep 29 #Python
Python 串口通信的实现
Sep 29 #Python
使用py-spy解决scrapy卡死的问题方法
Sep 29 #Python
详解python对象之间的交互
Sep 29 #Python
python PIL模块的基本使用
Sep 29 #Python
You might like
限制ckeditor上传图片文件大小的方法
2013/11/15 PHP
SESSION存放在数据库用法实例
2015/08/08 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
利用PHP判断是手机移动端还是PC端访问的函数示例
2017/12/14 PHP
JS 页面内容搜索,类似于 Ctrl+F功能的实现代码
2007/08/13 Javascript
JS获取整个页面文档的实现代码
2011/12/15 Javascript
express的中间件bodyParser详解
2014/12/04 Javascript
《JavaScript函数式编程》读后感
2015/08/07 Javascript
详解JavaScript中this关键字的用法
2016/05/26 Javascript
关于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法
2016/06/30 Javascript
深入浅出 jQuery中的事件机制
2016/08/23 Javascript
JS 实现Base64编码与解码实例详解
2016/11/07 Javascript
Angular2生命周期钩子函数的详细介绍
2017/07/10 Javascript
JavaScript中call和apply方法的区别实例分析
2018/08/03 Javascript
Vue父子组件之间的通信实例详解
2018/09/28 Javascript
详解CommonJS和ES6模块循环加载处理的区别
2018/12/26 Javascript
JavaScript实现Excel表格效果
2020/02/07 Javascript
JavaScript代理模式原理与用法实例详解
2020/03/10 Javascript
Python 时间操作例子和时间格式化参数小结
2014/04/24 Python
python实现换位加密算法的示例
2018/10/14 Python
python 堆和优先队列的使用详解
2019/03/05 Python
python实现大文本文件分割
2019/07/22 Python
Django admin禁用编辑链接和添加删除操作详解
2019/11/15 Python
pycharm运行scrapy过程图解
2019/11/22 Python
matplotlib.pyplot画图并导出保存的实例
2019/12/07 Python
关于ZeroMQ 三种模式python3实现方式
2019/12/23 Python
Pytorch 神经网络—自定义数据集上实现教程
2020/01/07 Python
以SQLite和PySqlite为例来学习Python DB API
2020/02/05 Python
python cookie反爬处理的实现
2020/11/01 Python
沃尔玛加拿大:Walmart.ca
2020/03/02 全球购物
护士毕业生自我鉴定
2014/02/08 职场文书
工作违纪检讨书
2014/02/17 职场文书
陈欧广告词
2014/03/14 职场文书
2015国庆节66周年演讲稿
2015/03/20 职场文书
三八妇女节主持词
2015/07/04 职场文书
SpringBoot前端后端分离之Nginx服务器下载安装过程
2022/08/14 Servers