python 生成器需注意的小问题


Posted in Python onSeptember 29, 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]

以上就是python 生成器需注意的小问题的详细内容,更多关于python 生成器的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python在控制台输出进度条的方法
Jun 20 Python
整理Python 常用string函数(收藏)
May 30 Python
python 性能优化方法小结
Mar 31 Python
python中(str,list,tuple)基础知识汇总
Feb 20 Python
django 使用 request 获取浏览器发送的参数示例代码
Jun 11 Python
pandas删除行删除列增加行增加列的实现
Jul 06 Python
python 图像处理画一个正弦函数代码实例
Sep 10 Python
python实现logistic分类算法代码
Feb 28 Python
Python ini文件常用操作方法解析
Apr 26 Python
浅谈Python中的继承
Jun 19 Python
Python txt文件常用读写操作代码实例
Aug 03 Python
selenium携带cookies模拟登陆CSDN的实现
Jan 19 Python
python 两种方法删除空文件夹
Sep 29 #Python
如何使用python写截屏小工具
Sep 29 #Python
python如何调用百度识图api
Sep 29 #Python
Python 串口通信的实现
Sep 29 #Python
使用py-spy解决scrapy卡死的问题方法
Sep 29 #Python
详解python对象之间的交互
Sep 29 #Python
python PIL模块的基本使用
Sep 29 #Python
You might like
PHP网页游戏学习之Xnova(ogame)源码解读(三)
2014/06/23 PHP
PHP实现显示照片exif信息的方法
2014/07/11 PHP
PHP递归删除多维数组中的某个值
2017/04/17 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
2017/12/21 PHP
javascript[js]获取url参数的代码
2007/10/17 Javascript
JavaScript下申明对象的几种方法小结
2008/10/02 Javascript
把html页面的部分内容保存成新的html文件的jquery代码
2009/11/12 Javascript
javascript getElementsByClassName实现代码
2010/10/11 Javascript
一个js控制的导航菜单实例代码
2013/12/03 Javascript
多个checkbox被选中时如何判断是否有自己想要的
2014/09/22 Javascript
JQuery实现动态添加删除评论的方法
2015/05/18 Javascript
js实现横向伸展开的二级导航菜单代码
2015/08/28 Javascript
学习javascript面向对象 掌握创建对象的9种方式
2016/01/04 Javascript
Adapter适配器模式在JavaScript设计模式编程中的运用分析
2016/05/18 Javascript
JS实现图片放大缩小的方法
2017/02/15 Javascript
详解vue过滤器在v2.0版本用法
2017/06/01 Javascript
jQuery实现倒计时功能 jQuery实现计时器功能
2017/09/19 jQuery
JS非行间样式获取函数的实例代码
2018/06/05 Javascript
AngularJS实现与后台服务器进行交互的示例讲解
2018/08/13 Javascript
JS操作json对象key、value的常用方法分析
2019/10/29 Javascript
vue 实现移动端键盘搜索事件监听
2019/11/06 Javascript
Vue中点击active并第一个默认选中功能的实现
2020/02/24 Javascript
JavaScript实现简单的弹窗效果
2020/05/19 Javascript
[00:17]游戏风云独家报道:DD赛后说出数字秘密 吓死你们啊!
2014/07/13 DOTA
Python基本数据类型详细介绍
2014/03/11 Python
用Python编写一个每天都在系统下新建一个文件夹的脚本
2015/05/04 Python
基于python进行桶排序与基数排序的总结
2018/05/29 Python
python Jupyter运行时间实例过程解析
2019/12/13 Python
使用pytorch 筛选出一定范围的值
2020/06/28 Python
Pycharm导入anaconda环境的教程图解
2020/07/31 Python
python 实时调取摄像头的示例代码
2020/11/25 Python
澳大利亚首个在线预订旅游网站:Wotif
2017/07/19 全球购物
澳洲女装时尚在线:Blue Bungalow
2018/05/05 全球购物
骨干教师事迹材料
2014/12/17 职场文书
2019银行员工个人工作自我鉴定
2019/06/27 职场文书
Python中常见的反爬机制及其破解方法总结
2021/06/10 Python