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利用matplotlib库绘制饼图的方法示例
Dec 18 Python
Python3 replace()函数使用方法
Mar 19 Python
在PyCharm中三步完成PyPy解释器的配置的方法
Oct 29 Python
Django之模型层多表操作的实现
Jan 08 Python
Python同步遍历多个列表的示例
Feb 19 Python
Python中list循环遍历删除数据的正确方法
Sep 02 Python
python rsa实现数据加密和解密、签名加密和验签功能
Sep 18 Python
详解使用Python下载文件的几种方法
Oct 13 Python
django框架cookie和session用法实例详解
Dec 10 Python
Python3 A*寻路算法实现方式
Dec 24 Python
对Tensorflow中tensorboard日志的生成与显示详解
Feb 04 Python
Django 解决distinct无法去除重复数据的问题
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
Drupal 添加模块出现莫名其妙的错误的解决方法(往往出现在模块较多时)
2011/04/18 PHP
destoon二次开发模板及调用语法汇总
2014/06/21 PHP
深入php内核之php in array
2015/11/10 PHP
PHP7.1方括号数组符号多值复制及指定键值赋值用法分析
2016/09/26 PHP
php使用json_decode后数字对象转换成了科学计数法的解决方法
2017/02/20 PHP
PHP数据库编程之MySQL优化策略概述
2017/08/16 PHP
URI、URL和URN之间的区别与联系
2006/12/20 Javascript
Javascript级联下拉菜单以及AJAX数据验证核心代码
2013/05/10 Javascript
用jquery等比例控制图片宽高的具体实现
2014/01/28 Javascript
可编辑下拉框的2种实现方式
2014/06/13 Javascript
显示今天的日期js代码(阳历和农历)
2014/09/30 Javascript
JavaScript中用getDate()方法返回指定日期的教程
2015/06/09 Javascript
Extjs实现下拉菜单效果
2016/04/01 Javascript
canvas绘制多边形
2017/02/24 Javascript
Vue项目中使用Vux的安装过程
2018/05/01 Javascript
微信小程序实现美团菜单
2018/06/06 Javascript
Windows上node.js的多版本管理工具用法实例分析
2019/11/06 Javascript
[38:40]2018DOTA2亚洲邀请赛 4.6淘汰赛 mineski vs LGD 第一场
2018/04/10 DOTA
对python中的pop函数和append函数详解
2018/05/04 Python
对python读取zip压缩文件里面的csv数据实例详解
2019/02/08 Python
bluepy 一款python封装的BLE利器简单介绍
2019/06/25 Python
Django框架ORM数据库操作实例详解
2019/11/07 Python
django自定义模板标签过程解析
2019/12/14 Python
Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式
2020/05/11 Python
Python实现Excel自动分组合并单元格
2021/02/22 Python
法国足球商店:Footcenter
2019/07/06 全球购物
Berghaus官网:户外服装和设备,防水服
2020/01/17 全球购物
Linux面试题LINUX系统类
2014/11/19 面试题
儿子婚宴答谢词
2014/01/09 职场文书
买卖协议书范本
2014/04/21 职场文书
需求分析说明书
2014/05/09 职场文书
抵押贷款承诺书
2014/05/30 职场文书
2014镇副书记群众路线专题民主生活会思想汇报
2014/09/23 职场文书
2014年学生工作总结
2014/11/20 职场文书
爱心捐款感谢信
2015/01/20 职场文书
Java elasticsearch安装以及部署教程
2021/06/28 Java/Android