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实现类继承实例
Jul 04 Python
在Python中调用ggplot的三种方法
Apr 08 Python
举例讲解Python中的Null模式与桥接模式编程
Feb 02 Python
selenium+python实现自动登录脚本
Apr 22 Python
机器学习之KNN算法原理及Python实现方法详解
Jul 09 Python
Python Excel处理库openpyxl使用详解
May 09 Python
pandas DataFrame索引行列的实现
Jun 04 Python
Python lxml模块的基本使用方法分析
Dec 21 Python
无惧面试,带你搞懂python 装饰器
Aug 17 Python
python des,aes,rsa加解密的实现
Jan 16 Python
python 提取html文本的方法
May 20 Python
Python pandas读取CSV文件的注意事项(适合新手)
Jun 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
整理的9个实用的PHP库简介和下载
2010/11/09 PHP
php输出含有“#”字符串的方法
2017/01/18 PHP
php计算多个集合的笛卡尔积实例详解
2017/02/16 PHP
PHP操作MongoDB实现增删改查功能【附php7操作MongoDB方法】
2018/04/24 PHP
php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例
2019/05/09 PHP
php生成随机数/生成随机字符串的方法小结【5种方法】
2020/05/27 PHP
初探jquery——表单应用范例
2007/02/20 Javascript
分享一个自己写的table表格排序js插件(高效简洁)
2011/10/29 Javascript
20款非常优秀的 jQuery 工具提示插件 推荐
2012/07/15 Javascript
悬浮数字的实现案例
2014/02/19 Javascript
node.js实现逐行读取文件内容的代码
2014/06/27 Javascript
基于Javascript实现弹出页面效果
2016/01/01 Javascript
Node.js Addons翻译(C/C++扩展)
2016/06/12 Javascript
JS实现的简单标签点击切换功能示例
2017/09/21 Javascript
详解Vue CLI3配置解析之css.extract
2018/09/14 Javascript
微信小程序常用的3种提示弹窗实现详解
2019/09/19 Javascript
js实现省级联动(数据结构优化)
2020/07/17 Javascript
使用Python实现在Windows下安装Django
2018/10/17 Python
详解利用Python scipy.signal.filtfilt() 实现信号滤波
2019/06/05 Python
PyQt4实时显示文本内容GUI的示例
2019/06/14 Python
VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法详解
2019/07/01 Python
python提取照片坐标信息的实例代码
2019/08/14 Python
python使用sessions模拟登录淘宝的方式
2019/08/16 Python
python中web框架的自定义创建
2019/09/08 Python
OpenCV灰度化之后图片为绿色的解决
2020/12/01 Python
python中xlrd模块的使用详解
2021/02/01 Python
HTML5拖拉上传文件的简单实例
2017/01/11 HTML / CSS
法国娇韵诗官方旗舰店:Clarins是来自法国的天然护肤品牌
2018/06/30 全球购物
毕业自我鉴定范文
2013/11/06 职场文书
乡镇网格化管理实施方案
2014/03/23 职场文书
微电影大赛策划方案
2014/06/05 职场文书
普通党员群众路线教育实践活动心得体会
2014/11/04 职场文书
2014年检验员工作总结
2014/11/19 职场文书
公司新员工欢迎词
2015/09/30 职场文书
聊聊Python String型列表求最值的问题
2022/01/18 Python
千万级用户系统SQL调优实战分享
2022/03/03 MySQL