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 相关文章推荐
9种python web 程序的部署方式小结
Jun 30 Python
Python中用format函数格式化字符串的用法
Apr 08 Python
python 环境变量和import模块导入方法(详解)
Jul 11 Python
Python基于property实现类的特性操作示例
Jun 15 Python
PyQt5重写QComboBox的鼠标点击事件方法
Jun 25 Python
Python Django Cookie 简单用法解析
Aug 13 Python
感知器基础原理及python实现过程详解
Sep 30 Python
python文字转语音的实例代码分析
Nov 12 Python
Python如何向SQLServer存储二进制图片
Jun 08 Python
tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this T
Jun 22 Python
解决TensorFlow调用Keras库函数存在的问题
Jul 06 Python
Python几种酷炫的进度条的方式
Apr 11 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中json_encode中文编码问题分析
2011/09/13 PHP
163的邮件用phpmailer发送(实例详解)
2013/06/24 PHP
PHP利用REFERER根居访问来地址进行页面跳转
2013/09/28 PHP
laravel 获取某个查询的查询SQL语句方法
2019/10/12 PHP
070823更新的一个[消息提示框]组件 兼容ie7
2007/08/29 Javascript
javascript学习笔记(七)Ajax和Http状态码
2014/10/08 Javascript
JavaScript实现的内存数据库LokiJS介绍和入门实例
2014/11/17 Javascript
JavaScript获取并更改input标签name属性的方法
2015/07/02 Javascript
利用jquery实现下拉框的禁用与启用
2016/12/07 Javascript
jQuery设置和获取select、checkbox、radio的选中值方法
2017/01/01 Javascript
angular forEach方法遍历源码解读
2017/01/25 Javascript
js实现随机点名系统(实例讲解)
2017/10/18 Javascript
Vue常用指令详解分析
2018/08/19 Javascript
解决vue v-for src 图片路径问题 404
2019/11/12 Javascript
react-intl实现React国际化多语言的方法
2020/09/27 Javascript
jQuery实现放大镜案例
2020/10/19 jQuery
[02:03]《现实生活中的DOTA2》—林书豪&DOTA2职业选手出演短片
2015/08/18 DOTA
[03:04]2018年度DOTA2玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
Python使用smtplib模块发送电子邮件的流程详解
2016/06/27 Python
Python实现矩阵转置的方法分析
2017/11/24 Python
Django项目中用JS实现加载子页面并传值的方法
2018/05/28 Python
python画图常规设置方式
2020/03/05 Python
linux 下selenium chrome使用详解
2020/04/02 Python
Python中操作各种多媒体,视频、音频到图片的代码详解
2020/06/04 Python
解决Keyerror ''acc'' KeyError: ''val_acc''问题
2020/06/18 Python
基于python实现计算两组数据P值
2020/07/10 Python
Python爬虫之Selenium库的使用方法
2021/01/03 Python
日本著名的平价时尚女性购物网站:Fifth
2016/08/24 全球购物
美国购买体育赛事门票网站:TicketCity
2019/03/06 全球购物
CAD制图设计师自荐信
2014/01/29 职场文书
岗位聘任书范文
2014/03/29 职场文书
建筑专业毕业生自荐信
2014/05/25 职场文书
2015年乡镇党务公开工作总结
2015/05/19 职场文书
2016保送生自荐信范文
2016/01/29 职场文书
2016简单的租房合同范本
2016/03/18 职场文书
互联网创业商业模式以及赚钱法则有哪些?
2019/10/12 职场文书