Python生成器常见问题及解决方案


Posted in Python onMarch 21, 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]

上述代码表明,可以临时改变i从而让生成器发生改变。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python多进程共享变量
Apr 06 Python
python队列通信:rabbitMQ的使用(实例讲解)
Dec 22 Python
python打包压缩、读取指定目录下的指定类型文件
Apr 12 Python
Python、 Pycharm、Django安装详细教程(图文)
Apr 12 Python
Python获取数据库数据并保存在excel表格中的方法
Jun 12 Python
详解Python打包分发工具setuptools
Aug 05 Python
利用Python的turtle库绘制玫瑰教程
Nov 23 Python
python 实现Flask中返回图片流给前端展示
Jan 09 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
Jan 13 Python
Python编写单元测试代码实例
Sep 10 Python
Python经纬度坐标转换为距离及角度的实现
Nov 01 Python
Requests什么的通通爬不了的Python超强反爬虫方案!
May 20 Python
Python作用域与名字空间原理详解
Mar 21 #Python
Python小整数对象池和字符串intern实例解析
Mar 21 #Python
Python描述符descriptor使用原理解析
Mar 21 #Python
Python如何省略括号方法详解
Mar 21 #Python
Python如何使用bokeh包和geojson数据绘制地图
Mar 21 #Python
Spring Boot中使用IntelliJ IDEA插件EasyCode一键生成代码详细方法
Mar 20 #Python
python+opencv实现移动侦测(帧差法)
Mar 20 #Python
You might like
生成静态页面的PHP类
2006/07/15 PHP
CI框架Session.php源码分析
2014/11/03 PHP
表单提交错误后返回内容消失问题的解决方法(PHP网站)
2015/10/20 PHP
php file_get_contents取文件中数组元素的方法
2017/04/01 PHP
php设计模式之建造器模式分析【星际争霸游戏案例】
2020/01/23 PHP
PHP序列化和反序列化深度剖析实例讲解
2020/12/29 PHP
JS对象转换为Jquery对象实现代码
2013/12/29 Javascript
利用window.name实现windowStorage代码分享
2014/01/02 Javascript
AngularJs实现分页功能不带省略号的代码
2016/05/30 Javascript
Node.js 实现简单小说爬虫实例
2016/11/18 Javascript
bootstrap模态框消失问题的解决方法
2016/12/02 Javascript
详解jQuery uploadify文件上传插件的使用方法
2016/12/16 Javascript
JSON中key动态设置及JSON.parse和JSON.stringify()的区别
2016/12/29 Javascript
JSON字符串和JSON对象相互转化实例详解
2017/01/05 Javascript
Vue侦测相关api的实现方法
2019/05/22 Javascript
JavaScript定时器设置、使用与倒计时案例详解
2019/07/08 Javascript
[03:42]2014DOTA2西雅图国际邀请赛7月9日TOPPLAY
2014/07/09 DOTA
在Mac OS系统上安装Python的Pillow库的教程
2015/11/20 Python
基于python 处理中文路径的终极解决方法
2018/04/12 Python
Selenium鼠标与键盘事件常用操作方法示例
2018/08/13 Python
django框架CSRF防护原理与用法分析
2019/07/22 Python
解决Python发送Http请求时,中文乱码的问题
2020/04/30 Python
python中yield的用法详解
2021/01/13 Python
canvas实现漂亮的下雨效果的示例
2018/04/18 HTML / CSS
Java模拟试题
2014/11/10 面试题
环境科学专业大学生自荐信格式
2013/09/21 职场文书
电气专业推荐信范文
2013/11/18 职场文书
给校长的建议书
2014/03/12 职场文书
《青蛙看海》教学反思
2014/04/23 职场文书
“四风”问题自我剖析材料思想汇报
2014/09/23 职场文书
领导干部作风建设工作总结
2014/10/23 职场文书
企业财务总监岗位职责
2015/04/03 职场文书
少年雷锋观后感
2015/06/10 职场文书
2016年十一促销广告语
2016/01/28 职场文书
SQL Server中使用判断语句(IF ELSE/CASE WHEN )案例
2021/07/07 SQL Server
阿里云服务器(windows)手动部署FTP站点详细教程
2022/08/05 Servers