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利用QQ邮箱发送邮件的实现方法(分享)
Jun 09 Python
Python数据结构之双向链表的定义与使用方法示例
Jan 16 Python
Python实现文件信息进行合并实例代码
Jan 17 Python
对Python捕获控制台输出流的方法详解
Jan 07 Python
python的pytest框架之命令行参数详解(下)
Jun 27 Python
12个步骤教你理解Python装饰器
Jul 01 Python
python实现超市管理系统(后台管理)
Oct 25 Python
关于numpy数组轴的使用详解
Dec 05 Python
如何使用Python抓取网页tag操作
Feb 14 Python
Python的collections模块真的很好用
Mar 01 Python
你喜欢篮球吗?Python实现篮球游戏
Jun 11 Python
利用Python第三方库实现预测NBA比赛结果
Jun 21 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
phpmyadmin 3.4 空密码登录的实现方法
2010/05/29 PHP
让PHP COOKIE立即生效,不用刷新就可以使用
2011/03/09 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
PHP性能分析工具xhprof的安装使用与注意事项
2017/12/19 PHP
Thinkphp 框架扩展之应用模式实现方法分析
2020/04/27 PHP
jquery 使用点滴函数代码
2011/05/20 Javascript
原生js操作checkbox用document.getElementById实现
2013/10/12 Javascript
js 限制input只能输入数字、字母和汉字等等
2013/12/18 Javascript
JavaScript中解析JSON数据的三种方法
2015/07/03 Javascript
BootstrapTable+KnockoutJS自定义T4模板快速生成增删改查页面
2016/08/01 Javascript
一个极为简单的requirejs实现方法
2016/10/20 Javascript
微信小程序  wx.request合法域名配置详解
2016/11/23 Javascript
Vue2.0利用 v-model 实现组件props双向绑定的优美解决方案
2017/03/13 Javascript
jQuery扩展_动力节点Java学院整理
2017/07/05 jQuery
webpack4+react多页面架构的实现
2018/10/25 Javascript
JavaScript 九种跨域方式实现原理
2019/02/11 Javascript
nodejs中request库使用HTTPS代理的方法
2019/04/30 NodeJs
VUE兄弟组件传值操作实例分析
2019/10/26 Javascript
element-ui 文件上传修改文件名的方法示例
2019/11/05 Javascript
Vue export import 导入导出的多种方式与区别介绍
2020/02/12 Javascript
Vue实现简单的拖拽效果
2020/08/25 Javascript
[01:01:14]完美世界DOTA2联赛PWL S2 SZ vs Rebirth 第一场 11.21
2020/11/23 DOTA
Windows和Linux下使用Python访问SqlServer的方法介绍
2015/03/10 Python
Python实现扩展内置类型的方法分析
2017/10/16 Python
Python实现文件信息进行合并实例代码
2018/01/17 Python
python自动12306抢票软件实现代码
2018/02/24 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
2019/01/19 Python
Pycharm远程调试原理及具体配置详解
2019/08/08 Python
python 浅谈serial与stm32通信的编码问题
2019/12/18 Python
使用遗传算法求二元函数的最小值
2020/02/11 Python
结婚喜宴家长答谢词
2014/01/15 职场文书
大学生通用个人的自我评价
2014/02/10 职场文书
机关单位动员会主持词
2014/03/20 职场文书
2014年重阳节敬老活动方案
2014/09/16 职场文书
Python OpenCV超详细讲解基本功能
2022/04/02 Python
JS前端监控采集用户行为的N种姿势
2022/07/23 Javascript