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基于scrapy采集数据时使用代理服务器的方法
Apr 16 Python
详解使用python的logging模块在stdout输出的两种方法
May 17 Python
Python基于回溯法子集树模板实现8皇后问题
Sep 01 Python
selenium python浏览器多窗口处理代码示例
Jan 15 Python
python删除不需要的python文件方法
Apr 24 Python
python笔记之mean()函数实现求取均值的功能代码
Jul 05 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
Sep 20 Python
python安装gdal的两种方法
Oct 29 Python
解决matplotlib.pyplot在Jupyter notebook中不显示图像问题
Apr 22 Python
在vscode中启动conda虚拟环境的思路详解
Dec 25 Python
基于python制作简易版学生信息管理系统
Apr 20 Python
python实现黄金分割法的示例代码
Apr 28 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
关于手调机和数调机的选择
2021/03/02 无线电
我的论坛源代码(三)
2006/10/09 PHP
Windows中安装Apache2和PHP4权威指南
2006/11/18 PHP
php 连接mysql连接被重置的解决方法
2011/02/15 PHP
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
2012/06/13 PHP
深入解析PHP的引用计数机制
2013/06/14 PHP
php 如何获取数组第一个值
2013/08/06 PHP
PHP删除字符串中非字母数字字符方法总结
2019/01/20 PHP
jQuery1.5.1 animate方法源码阅读
2011/04/05 Javascript
非常强大的 jQuery.AsyncBox 弹出对话框插件
2011/08/29 Javascript
JavaScript中变量提升 Hoisting
2012/07/03 Javascript
js获取图片宽高的方法
2015/11/25 Javascript
JavaScript编写检测用户所使用的浏览器的代码示例
2016/05/05 Javascript
工作中常用的js、jquery自定义扩展函数代码片段汇总
2016/12/22 Javascript
微信小程序 支付简单实例及注意事项
2017/01/06 Javascript
详解nodejs微信公众号开发——2.自动回复
2017/04/10 NodeJs
HTML5+Canvas调用手机拍照功能实现图片上传(上)
2017/04/21 Javascript
基于Jquery Ajax type的4种类型(详解)
2017/08/02 jQuery
JavaScript fetch接口案例解析
2018/08/30 Javascript
微信小程序开发实现的选项卡(窗口顶部/底部TabBar)页面切换功能图文详解
2019/05/14 Javascript
javascript随机变色实例代码
2019/10/15 Javascript
javascript前端和后台进行数据交互方法示例
2020/08/07 Javascript
python基础教程之数字处理(math)模块详解
2014/03/25 Python
python 爬虫一键爬取 淘宝天猫宝贝页面主图颜色图和详情图的教程
2018/05/22 Python
Sanic框架安装与简单入门示例
2018/07/16 Python
Python异步操作MySQL示例【使用aiomysql】
2019/05/16 Python
python模块常用用法实例详解
2019/10/17 Python
ubuntu 安装pyqt5和卸载pyQt5的方法
2020/03/24 Python
python3.6使用SMTP协议发送邮件
2020/05/20 Python
PyCharm MySQL可视化Database配置过程图解
2020/06/09 Python
Python自省及反射原理实例详解
2020/07/06 Python
使用HTML5的File实现base64和图片的互转
2013/08/01 HTML / CSS
REISS美国官网:伦敦最受欢迎的时尚品牌
2019/08/16 全球购物
美国家居装饰店:Pier 1
2019/09/04 全球购物
英语道歉信范文
2014/01/09 职场文书
网上签名寄语活动留言
2014/01/18 职场文书