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下的XSLT API进行web开发的简单教程
Apr 15 Python
详解Python的Django框架中的模版继承
Jul 16 Python
python爬虫实现教程转换成 PDF 电子书
Feb 19 Python
彻底搞懂Python字符编码
Jan 23 Python
Sanic框架路由用法实例分析
Jul 16 Python
python文件操作之批量修改文件后缀名的方法
Aug 10 Python
Python 通过打码平台实现验证码的实现
May 13 Python
Python实现Selenium自动化Page模式
Jul 14 Python
python opencv 简单阈值算法的实现
Aug 04 Python
python中字典按键或键值排序的实现代码
Aug 27 Python
python针对Oracle常见查询操作实例分析
Apr 30 Python
Python下opencv使用hough变换检测直线与圆
Jun 18 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使用smtp发送支持附件的邮件示例
2014/04/13 PHP
php判断对象是派生自哪个类的方法
2015/06/20 PHP
PHP中spl_autoload_register()函数用法实例详解
2016/07/18 PHP
php中遍历二维数组并以表格的形式输出的方法
2017/01/03 PHP
Laravel如何实现自动加载类
2019/10/14 PHP
Array, Array Constructor, for in loop, typeof, instanceOf
2011/09/13 Javascript
一个基于jQuery的树型插件(OrangeTree)使用介绍
2012/05/03 Javascript
js左右弹性滚动对联广告代码分享
2014/02/19 Javascript
js 金额格式化来回转换示例
2014/02/23 Javascript
jQuery中removeClass()方法用法实例
2015/01/05 Javascript
基于jQuery实现文本框只能输入数字(小数、整数)
2016/01/14 Javascript
javascript显示上周、上个月日期的处理方法
2016/02/03 Javascript
jQuery+php实时获取及响应文本框输入内容的方法
2016/05/24 Javascript
svg动画之动态描边效果
2017/02/22 Javascript
微信小程序云开发详细教程
2019/05/16 Javascript
Emberjs 通过 axios 下载文件的方法
2019/09/03 Javascript
layui异步加载table表中某一列数据的例子
2019/09/16 Javascript
解决echarts 一条柱状图显示两个值,类似进度条的问题
2020/07/20 Javascript
详解Python3中yield生成器的用法
2015/08/20 Python
举例讲解Python面向对象编程中类的继承
2016/06/17 Python
深入理解Python对Json的解析
2017/02/14 Python
Python 网络爬虫--关于简单的模拟登录实例讲解
2018/06/01 Python
APIStar:一个专为Python3设计的API框架
2018/09/26 Python
django将数组传递给前台模板的方法
2019/08/06 Python
用Python写一个自动木马程序
2019/09/17 Python
基于python实现计算且附带进度条代码实例
2020/03/31 Python
Blank NYC官网:夹克、牛仔裤等
2020/12/16 全球购物
公司道歉信范文
2014/01/09 职场文书
年终考核评语
2014/01/19 职场文书
优秀护士演讲稿
2014/04/30 职场文书
群教班子对照检查材料
2014/08/26 职场文书
工作自我推荐信范文
2015/03/25 职场文书
2016新年致辞
2015/08/01 职场文书
豆瓣2021评分最高动画剧集-豆瓣评分最高的动画剧集2021
2022/03/18 日漫
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
2022/04/11 Python
MySql如何将查询的出来的字段进行转换
2022/06/14 MySQL