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 28 Python
Python 加密的实例详解
Oct 09 Python
python利用正则表达式排除集合中字符的功能示例
Oct 10 Python
Python读取系统文件夹内所有文件并统计数量的方法
Oct 23 Python
浅谈PYTHON 关于文件的操作
Mar 19 Python
Django处理Ajax发送的Get请求代码详解
Jul 29 Python
Python如何基于selenium实现自动登录博客园
Dec 16 Python
flask利用flask-wtf验证上传的文件的方法
Jan 17 Python
如何在django中实现分页功能
Apr 22 Python
Win10环境中如何实现python2和python3并存
Jul 20 Python
Python自然语言处理之切分算法详解
Apr 25 Python
Django项目如何获得SSL证书与配置HTTPS
Apr 30 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
PHP7 参数处理机制修改
2021/03/09 PHP
用javascript实现页面打印的三种方法
2007/03/05 Javascript
javascript 操作cookies及正确使用cookies的属性
2009/10/15 Javascript
dtree 网页树状菜单及传递对象集合到js内,动态生成节点
2012/04/14 Javascript
JQuery实现简单验证码提示解决方案
2012/12/20 Javascript
点击进行复制的JS代码实例
2013/08/23 Javascript
jquery对象和javascript对象即DOM对象相互转换
2014/08/07 Javascript
JavaScript实现的简单幂函数实例
2015/04/17 Javascript
js获取url传值的方法
2015/12/18 Javascript
Bootstrap Chart组件使用教程
2016/04/28 Javascript
js+html5实现canvas绘制网页时钟的方法
2016/05/21 Javascript
js获取元素的标签名实现方法
2016/10/08 Javascript
Vue-cli创建项目从单页面到多页面的方法
2017/09/20 Javascript
react native与webview通信的示例代码
2017/09/25 Javascript
Nest.js环境变量配置与序列化详解
2021/02/21 Javascript
[06:48]DOTA2-DPC中国联赛2月26日Recap集锦
2021/03/11 DOTA
python urllib urlopen()对象方法/代理的补充说明
2017/06/29 Python
机器学习10大经典算法详解
2017/12/07 Python
django文档学习之applications使用详解
2018/01/29 Python
Pytorch提取模型特征向量保存至csv的例子
2020/01/03 Python
django admin管理工具自定义时间区间筛选器DateRangeFilter介绍
2020/05/19 Python
django queryset 去重 .distinct()说明
2020/05/19 Python
Python通过类的组合模拟街道红绿灯
2020/09/16 Python
html5小技巧之通过document.head获取head元素
2014/06/04 HTML / CSS
墨西哥网上购物:Linio墨西哥
2016/10/20 全球购物
Nebula美国官网:便携式投影仪
2019/03/15 全球购物
酒店员工检讨书
2014/02/18 职场文书
机关工会开展学习雷锋活动总结
2014/03/01 职场文书
2014年教研工作总结
2014/12/06 职场文书
保险公司客户经理岗位职责
2015/04/09 职场文书
团拜会主持词
2015/07/04 职场文书
教师节作文之小学四年级
2019/09/03 职场文书
PHP设计模式(观察者模式)
2021/07/07 PHP
Redis调用Lua脚本及使用场景快速掌握
2022/03/16 Redis
Java版 简易五子棋小游戏
2022/05/04 Java/Android
pd.drop_duplicates删除重复行的方法实现
2022/06/16 Python