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处理JSON时的值报错及编码报错的两则解决实录
Jun 26 Python
简单实现Python爬取网络图片
Apr 01 Python
python字典和json.dumps()的遇到的坑分析
Mar 11 Python
python实现控制台输出彩色字体
Apr 05 Python
python3中sys.argv的实例用法
Apr 24 Python
keras打印loss对权重的导数方式
Jun 10 Python
浅谈OpenCV中的新函数connectedComponentsWithStats用法
Jul 05 Python
Python如何将字符串转换为日期
Jul 31 Python
基于Python制作一副扑克牌过程详解
Oct 19 Python
anaconda安装pytorch1.7.1和torchvision0.8.2的方法(亲测可用)
Feb 01 Python
一文读懂python Scrapy爬虫框架
Feb 24 Python
Python上下文管理器Content Manager
Jun 26 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模板技术[转]
2007/01/04 PHP
mac下使用brew配置环境的步骤分享
2011/05/23 PHP
PHP使用PDO抽象层获取查询结果的方法示例
2018/05/10 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
JavaScript中出现乱码的处理心得
2009/12/24 Javascript
jquery 选项卡效果 新手代码
2011/07/08 Javascript
js实现网页右上角滑出会自动消失大幅广告的方法
2015/02/27 Javascript
jquery attr()设置和获取属性值实例教程
2016/09/25 Javascript
JavaScript重定向URL参数的两种方法小结
2016/10/19 Javascript
半个小时学json(json传递示例)
2016/12/25 Javascript
html+javascript+bootstrap实现层级多选框全层全选和多选功能
2017/03/09 Javascript
基于JavaScript实现移动端无限加载分页
2017/03/27 Javascript
Angular2 父子组件数据通信实例
2017/06/22 Javascript
判断js数据类型的函数实例详解
2019/05/23 Javascript
解决vue watch数据的方法被调用了两次的问题
2020/11/07 Javascript
[00:12]2018DOTA2亚洲邀请赛 sylar表现SOLO技艺
2018/04/06 DOTA
[01:32]TI奖金增速竟因它再创新高!DOTA2勇士令状不朽珍藏Ⅰ饰品欣赏
2018/05/18 DOTA
Django中传递参数到URLconf的视图函数中的方法
2015/07/18 Python
在Mac OS上使用mod_wsgi连接Python与Apache服务器
2015/12/24 Python
python实现判断一个字符串是否是合法IP地址的示例
2018/06/04 Python
Windows下python3.6.4安装教程
2018/07/31 Python
Python实现封装打包自己写的代码,被python import
2020/07/12 Python
浅谈anaconda python 版本对应关系
2020/10/07 Python
Python离线安装各种库及pip的方法
2020/11/28 Python
如何查看浏览器对html5的支持情况
2020/12/15 HTML / CSS
梵蒂冈和罗马卡:Omnia Card Pass
2018/02/10 全球购物
jurlique茱莉蔻英国官网:澳洲天然护肤品
2018/08/03 全球购物
预订旅游活动、景点和旅游:GetYourGuide
2019/09/29 全球购物
HashMap和Hashtable的区别
2013/05/18 面试题
文件中有一组整数,要求排序后输出到另一个文件中
2012/01/04 面试题
产品销售员岗位职责
2013/12/18 职场文书
农场厂长岗位职责
2013/12/28 职场文书
五一手机促销方案
2014/03/08 职场文书
《飞向蓝天的恐龙》教学反思
2014/04/09 职场文书
2015社区爱国卫生工作总结
2015/04/21 职场文书
openGauss数据库JDBC环境连接配置的详细过程(Eclipse)
2022/06/01 Java/Android