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中利用Future对象异步返回结果示例代码
Sep 07 Python
python爬虫系列Selenium定向爬取虎扑篮球图片详解
Nov 15 Python
Python实现矩阵加法和乘法的方法分析
Dec 19 Python
Python浅复制中对象生存周期实例分析
Apr 02 Python
pandas中的DataFrame按指定顺序输出所有列的方法
Apr 10 Python
对python多线程与global变量详解
Nov 09 Python
浅谈python之高阶函数和匿名函数
Mar 21 Python
python2和python3在处理字符串上的区别详解
May 29 Python
python协程gevent案例 爬取斗鱼图片过程解析
Aug 27 Python
浅谈pytorch 模型 .pt, .pth, .pkl的区别及模型保存方式
May 25 Python
13个Pandas实用技巧,助你提高开发效率
Aug 19 Python
如何在Python3中使用telnetlib模块连接网络设备
Sep 21 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文件上传原理简单分析
2011/05/29 PHP
php实现可以设置中奖概率的抽奖程序代码分享
2014/01/19 PHP
深入分析PHP引用(&)
2014/09/04 PHP
php文件上传简单实现方法
2015/01/24 PHP
基于php判断客户端类型
2016/10/14 PHP
php输出图像的方法实例分析
2017/02/16 PHP
PHP高并发和大流量解决方案整理
2021/03/09 PHP
JQuery中根据属性或属性值获得元素(6种情况获取方法)
2013/01/17 Javascript
js控制frameSet示例
2013/09/10 Javascript
jQuery拖动元素并对元素进行重新排序
2015/12/30 Javascript
jQuery插件EasyUI设置datagrid的checkbox为禁用状态的方法
2016/08/05 Javascript
Javascript 链式作用域详细介绍
2017/02/23 Javascript
JavaScript表单验证实现代码
2017/05/22 Javascript
Nodejs异步回调之异常处理实例分析
2018/06/22 NodeJs
浅谈Webpack下多环境配置的思路
2018/06/27 Javascript
javascript中一些奇葩的日期换算方法总结
2018/11/14 Javascript
vue 详情跳转至列表页实现列表页缓存
2019/03/27 Javascript
javascript实现移动端红包雨页面
2020/06/23 Javascript
[07:12]2014DOTA2西雅图国际邀请赛 黑马Liquid专题采访
2014/07/12 DOTA
教你安装python Django(图文)
2013/11/04 Python
对numpy中的transpose和swapaxes函数详解
2018/08/02 Python
django框架事务处理小结【ORM 事务及raw sql,customize sql 事务处理】
2019/06/27 Python
python GUI库图形界面开发之PyQt5布局控件QVBoxLayout详细使用方法与实例
2020/03/06 Python
Python函数参数定义及传递方式解析
2020/06/10 Python
python两种获取剪贴板内容的方法
2020/11/06 Python
PyCharm2020.3.2安装超详细教程
2021/02/08 Python
python实现不同数据库间数据同步功能
2021/02/25 Python
css3中background新增的4个新的相关属性用法介绍
2013/09/26 HTML / CSS
浅析border-radius如何兼容IE
2016/04/19 HTML / CSS
澳大利亚网上买书:Angus & Robertson
2019/07/21 全球购物
一位农村小子的自荐信
2014/04/07 职场文书
生日庆典策划方案
2014/06/02 职场文书
积极向上的团队口号
2014/06/06 职场文书
元旦联欢晚会主持词
2015/07/01 职场文书
如何在Python中创建二叉树
2021/03/30 Python
Python实现Telnet自动连接检测密码的示例
2021/04/16 Python