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中合并两个文本文件并按照姓名首字母排序的例子
Apr 25 Python
Pycharm 设置默认头的图文教程
Jan 17 Python
Python检查ping终端的方法
Jan 26 Python
python爬虫 基于requests模块的get请求实现详解
Aug 20 Python
python jenkins 打包构建代码的示例代码
Nov 29 Python
Python基于class()实现面向对象原理详解
Mar 26 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
Apr 03 Python
将tf.batch_matmul替换成tf.matmul的实现
Jun 18 Python
TensorFlow中如何确定张量的形状实例
Jun 23 Python
Python基于httpx模块实现发送请求
Jul 07 Python
python多线程和多进程关系详解
Dec 14 Python
Python 虚拟环境工作原理解析
Dec 24 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 页面跳转到另一个页面的多种方法方法总结
2009/07/07 PHP
php实现首页链接查询 友情链接检查的代码
2010/01/05 PHP
php结合ACCESS的跨库查询功能
2015/06/12 PHP
Centos6.5和Centos7 php环境搭建方法
2016/05/27 PHP
php微信公众平台开发(三)订阅事件处理
2016/12/06 PHP
PHP中使用OpenSSL生成证书及加密解密
2017/02/05 PHP
慎用 somefunction.prototype 分析
2009/06/02 Javascript
javascript OFFICE控件测试代码
2009/12/08 Javascript
Jquery中使用setInterval和setTimeout的方法
2013/04/08 Javascript
node.js使用npm 安装插件时提示install Error: ENOENT报错的解决方法
2014/11/20 Javascript
node.js中的querystring.stringify方法使用说明
2014/12/10 Javascript
JQuery中的事件及动画用法实例
2015/01/26 Javascript
JS表的模拟方法
2015/02/05 Javascript
jQuery插件animateSlide制作多点滑动幻灯片
2015/06/11 Javascript
javascript中的try catch异常捕获机制用法分析
2016/12/14 Javascript
利用Node.js对文件进行重命名
2017/03/12 Javascript
Linux CentOS系统下安装node.js与express的方法
2017/04/01 Javascript
在 Vue-CLI 中引入 simple-mock实现简易的 API Mock 接口数据模拟
2018/11/28 Javascript
微信小程序和H5页面间相互跳转代码实例
2019/09/19 Javascript
react-native聊天室|RN版聊天App仿微信实例|RN仿微信界面
2019/11/12 Javascript
python PIL模块与随机生成中文验证码
2016/02/27 Python
python 打印对象的所有属性值的方法
2016/09/11 Python
对python list 遍历删除的正确方法详解
2018/06/29 Python
pycharm激活码有效到2020年11月底
2020/09/18 Python
Ranorex通过Python将报告发送到邮箱的方法
2020/01/12 Python
python3注册全局热键的实现
2020/03/22 Python
python中setuptools的作用是什么
2020/06/19 Python
Python 常用日期处理 -- calendar 与 dateutil 模块的使用
2020/09/02 Python
基于 HTML5 WebGL 实现的医疗物流系统
2019/10/08 HTML / CSS
Rodd & Gunn澳大利亚官网:新西兰男装品牌
2018/09/25 全球购物
美国在线眼镜店:GlassesShop
2018/11/15 全球购物
远程调用的原理
2014/07/05 面试题
自考毕业生自我鉴定
2013/11/04 职场文书
篮球比赛拉拉队口号
2014/06/10 职场文书
教师个人自我剖析材料
2014/09/29 职场文书
2016年社会主义核心价值观心得体会
2016/01/21 职场文书