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 相关文章推荐
详解Django中的form库的使用
Jul 18 Python
Python文本相似性计算之编辑距离详解
Nov 28 Python
Python3中使用PyMongo的方法详解
Jul 28 Python
解决Python print 输出文本显示 gbk 编码错误问题
Jul 13 Python
python字符串替换第一个字符串的方法
Jun 26 Python
Python学习笔记之lambda表达式用法详解
Aug 08 Python
在pytorch中为Module和Tensor指定GPU的例子
Aug 19 Python
tesserocr与pytesseract模块的使用方法解析
Aug 30 Python
python3中关于excel追加写入格式被覆盖问题(实例代码)
Jan 10 Python
使用TensorFlow搭建一个全连接神经网络教程
Feb 06 Python
Python模拟登入的N种方式(建议收藏)
May 31 Python
numpy的Fancy Indexing和array比较详解
Jun 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随机取mysql记录方法小结
2014/12/27 PHP
试用php中oci8扩展
2015/06/18 PHP
Yii2如何批量添加数据
2016/05/17 PHP
PHP魔术方法以及关于独立实例与相连实例的全面讲解
2016/10/18 PHP
PHPCMS忘记后台密码的解决办法
2016/10/30 PHP
PHP基于ORM方式操作MySQL数据库实例
2017/06/21 PHP
javascript同步Import,同步调用外部js的方法
2008/07/08 Javascript
jquery miniui 教程 表格控件 合并单元格应用
2012/11/25 Javascript
Javascript图像处理思路及实现代码
2012/12/25 Javascript
jquery mobile事件多次绑定示例代码
2013/09/13 Javascript
JS格式化数字保留两位小数点示例代码
2013/10/15 Javascript
嵌入式iframe子页面与父页面js通信的方法
2015/01/20 Javascript
Backbone.js的一些使用技巧
2015/07/01 Javascript
JS实现的自定义显示加载等待图片插件(loading.gif)
2016/06/17 Javascript
Vue的Eslint配置文件eslintrc.js说明与规则介绍
2020/02/03 Javascript
JQuery+drag.js上传图片并且实现图片拖曳
2020/11/18 jQuery
[08:04]TI4西雅图DOTA2前线报道 海涛探访各路人马
2014/07/09 DOTA
[46:58]完美世界DOTA2联赛PWL S3 Forest vs LBZS 第一场 12.17
2020/12/19 DOTA
使用python 和 lint 删除项目无用资源的方法
2017/12/20 Python
flask-socketio实现WebSocket的方法
2018/07/31 Python
浅析Python 中几种字符串格式化方法及其比较
2019/07/02 Python
python爬虫今日热榜数据到txt文件的源码
2021/02/23 Python
加利福尼亚州威尼斯的女性奢侈品设计师服装和概念店:Mona Moore
2018/09/13 全球购物
苏格兰在线威士忌商店:The Whisky Barrel
2019/05/07 全球购物
android面试问题与答案
2016/12/27 面试题
业绩考核岗位职责
2014/02/01 职场文书
运动会通讯稿150字
2014/02/15 职场文书
大学生简短的自我评价分享
2014/02/20 职场文书
实训报告范文大全
2014/11/04 职场文书
2015年数学教研工作总结
2015/07/22 职场文书
学校运动会感想
2015/08/10 职场文书
《刺客之王:C罗全景传记》:时代从来不会亏待手艺人
2019/11/28 职场文书
JS实现简单控制视频播放倍速的实例代码
2021/04/18 Javascript
CSS的class与id常用的命名规则
2021/05/18 HTML / CSS
详解Laravel制作API接口
2021/05/31 PHP
Python中np.random.randint()参数详解及用法实例
2022/09/23 Python