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实现人人网登录示例分享
Jan 19 Python
在Gnumeric下使用Python脚本操作表格的教程
Apr 14 Python
在Python中使用列表生成式的教程
Apr 27 Python
在Python中使用PIL模块处理图像的教程
Apr 29 Python
django中静态文件配置static的方法
May 20 Python
Python使用爬虫爬取静态网页图片的方法详解
Jun 05 Python
Python函数和模块的使用总结
May 20 Python
Python3常用内置方法代码实例
Nov 18 Python
Python计算不规则图形面积算法实现解析
Nov 22 Python
python实现发送带附件的邮件代码分享
Sep 22 Python
vue.js刷新当前页面的实例讲解
Dec 29 Python
pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作
May 22 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
thinkphp路由规则使用示例详解和伪静态功能实现(apache重写)
2014/02/24 PHP
php中最简单的字符串匹配算法
2014/12/16 PHP
浅谈PHP中output_buffering
2015/07/13 PHP
让您的菜单不离网站
2006/10/03 Javascript
js window.event对象详尽解析
2009/02/17 Javascript
jQuery如何实现点击页面获得当前点击元素的id或其他信息
2014/01/09 Javascript
浅谈JavaScript字符集
2014/05/22 Javascript
jquery中表单 多选框的一种巧妙写法
2015/09/06 Javascript
BootStrap扔进Django里的方法详解
2016/05/13 Javascript
PassWord输入框代码分享
2016/06/07 Javascript
javascript简单实现跟随滚动条漂浮的返回顶部按钮效果
2016/08/19 Javascript
JS实现图片延迟加载并淡入淡出效果的简单方法
2016/08/25 Javascript
React Form组件的实现封装杂谈
2018/05/07 Javascript
web页面和微信小程序页面实现瀑布流效果
2018/09/26 Javascript
微信小程序实现工作时间段选择
2019/02/15 Javascript
通过Nodejs搭建网站简单实现注册登录流程
2019/06/14 NodeJs
js实现抽奖功能
2020/11/24 Javascript
[05:53]敌法师的金色冠名ID"BurNIng",是传说,是荣耀
2020/07/11 DOTA
python控制台中实现进度条功能
2015/11/10 Python
Python selenium 父子、兄弟、相邻节点定位方式详解
2016/09/15 Python
Python 3.x 判断 dict 是否包含某键值的实例讲解
2018/07/06 Python
PyQt5实现简易计算器
2020/05/30 Python
在python Numpy中求向量和矩阵的范数实例
2019/08/26 Python
Python基于正则表达式实现计算器功能
2020/07/13 Python
CSS3中的clip-path使用攻略
2015/08/03 HTML / CSS
CSS3贝塞尔曲线示例:创建链接悬停动画效果
2020/11/19 HTML / CSS
canvas 如何绘制线段的实现方法
2018/07/12 HTML / CSS
Python面试题:Python里面如何生成随机数
2015/03/12 面试题
文秘专业大学生求职信
2013/11/10 职场文书
人事专员岗位职责
2013/11/20 职场文书
幼儿园实习自我鉴定
2013/12/15 职场文书
校园歌手大赛策划书
2014/01/17 职场文书
大学秋游活动方案
2014/02/11 职场文书
公司合作意向书
2014/04/01 职场文书
给女朋友道歉的话大全
2015/01/20 职场文书
python实现网络五子棋
2021/04/11 Python