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之print详解
Sep 28 Python
Python读取键盘输入的2种方法
Jun 16 Python
Python的爬虫程序编写框架Scrapy入门学习教程
Jul 02 Python
详解python Todo清单实战
Nov 01 Python
Python爬虫——爬取豆瓣电影Top250代码实例
Apr 17 Python
Django 数据库同步操作技巧详解
Jul 19 Python
Python Pandas 箱线图的实现
Jul 23 Python
如何利用python给图片添加半透明水印
Sep 06 Python
django 取消csrf限制的实例
Mar 13 Python
解决django接口无法通过ip进行访问的问题
Mar 27 Python
Python中常见的反爬机制及其破解方法总结
Jun 10 Python
Python基于百度API识别并提取图片中文字
Jun 27 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抽象类 介绍
2012/06/13 PHP
laravel 5 实现模板主题功能
2015/03/02 PHP
PHP Trait代码复用类与多继承实现方法详解
2019/06/17 PHP
JavaScript中的Screen屏幕对象
2008/01/16 Javascript
Javascript 强制类型转换函数
2009/05/17 Javascript
CCPry JS类库 代码
2009/10/30 Javascript
JavaScript使用RegExp进行正则匹配的方法
2015/07/11 Javascript
js中利用tagname和id获取元素的方法
2016/01/03 Javascript
百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换
2016/02/19 Javascript
jQuery中通过ajax调用webservice传递数组参数的问题实例详解
2016/05/20 Javascript
Javascript实现汉字和拼音互转的终极方案
2016/10/19 Javascript
基于jQuery实现火焰灯效果导航菜单
2017/01/04 Javascript
layui.js实现的表单验证功能示例
2017/11/15 Javascript
Angular @HostBinding()和@HostListener()用法
2018/03/05 Javascript
微信小程序拍照和摄像功能实现方法示例
2019/02/01 Javascript
js实现上下左右键盘控制div移动
2020/01/16 Javascript
vue 遮罩层阻止默认滚动事件操作
2020/07/28 Javascript
[01:08:00]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[01:38]完美世界DOTA2联赛(PWL)宣传片:第一站
2020/10/26 DOTA
python实现一次创建多级目录的方法
2015/05/15 Python
MAC中PyCharm设置python3解释器
2017/12/15 Python
在cmd中运行.py文件: python的操作步骤
2018/05/12 Python
python实现自动解数独小程序
2019/01/21 Python
Python多进程fork()函数详解
2019/02/22 Python
python 接口实现 供第三方调用的例子
2019/08/13 Python
numpy中三维数组中加入元素后的位置详解
2019/11/28 Python
如何用Matplotlib 画三维图的示例代码
2020/07/28 Python
英国最大的奢侈珠宝和手表网站:C W Sellors
2017/02/10 全球购物
阿迪达斯中国官网:Adidas中国
2020/12/14 全球购物
应届毕业生求职信范文
2013/12/18 职场文书
市场营销管理制度
2014/01/29 职场文书
会计岗位职责范本
2014/03/07 职场文书
房屋转让协议书范本
2014/04/11 职场文书
新教师个人工作总结
2015/02/06 职场文书
2015年打非治违工作总结
2015/04/02 职场文书
java设计模式--三种工厂模式详解
2021/07/21 Java/Android