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使用xauth方式登录饭否网然后发消息
Apr 11 Python
python 字典(dict)遍历的四种方法性能测试报告
Jun 25 Python
Python实现获取网站PR及百度权重
Jan 21 Python
Python使用当前时间、随机数产生一个唯一数字的方法
Sep 18 Python
python代码实现ID3决策树算法
Dec 20 Python
完美解决安装完tensorflow后pip无法使用的问题
Jun 11 Python
python去除拼音声调字母,替换为字母的方法
Nov 28 Python
django搭建项目配置环境和创建表过程详解
Jul 22 Python
安装python3.7编译器后如何正确安装opnecv的方法详解
Jun 16 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
Aug 07 Python
python如何实现图片压缩
Sep 11 Python
python实现马丁策略的实例详解
Jan 15 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数组相加操作及与array_merge的区别浅析
2016/11/26 PHP
实例讲解YII2中多表关联的使用方法
2017/07/21 PHP
封装好的省市地区联动控件附下载
2007/08/13 Javascript
用js实现下载远程文件并保存在本地的脚本
2008/05/06 Javascript
js setattribute批量设置css样式
2009/11/26 Javascript
jquery URL参数判断,确定菜单样式
2010/05/31 Javascript
(jQuery,mootools,dojo)使用适合自己的编程别名命名
2010/09/14 Javascript
jQuery 1.8 Release版本发布了
2012/08/14 Javascript
jQuery function的正确书写方法
2013/08/02 Javascript
JavaScript去除数组里重复值的方法
2015/07/13 Javascript
纯js模仿windows系统日历
2017/02/04 Javascript
使用vue的transition完成滑动过渡的示例代码
2018/06/25 Javascript
Vue 2.0 侦听器 watch属性代码详解
2019/06/19 Javascript
layui文件上传控件带更改后数据传值的方法
2019/09/23 Javascript
Vue实现点击按钮复制文本内容的例子
2019/11/09 Javascript
Vue路由管理器Vue-router的使用方法详解
2020/02/05 Javascript
vue祖孙组件之间的数据传递案例
2020/12/07 Vue.js
Python常用知识点汇总
2016/05/08 Python
轻松理解Python 中的 descriptor
2017/09/15 Python
Python操作word常见方法示例【win32com与docx模块】
2018/07/17 Python
Python爬虫实现HTTP网络请求多种实现方式
2020/06/19 Python
Roots加拿大官网:加拿大休闲服饰品牌
2016/10/24 全球购物
家用个人磨皮机:Trophy Skin
2017/03/30 全球购物
英国受欢迎的运动鞋和街头服装商店:Footasylum
2018/06/12 全球购物
Roxy荷兰官方网站:冲浪、滑雪板、服装和配件
2019/10/22 全球购物
华三通信H3C面试题
2015/05/15 面试题
高中生物教学反思
2014/02/05 职场文书
团队精神的演讲稿
2014/05/14 职场文书
课程设计的心得体会
2014/09/03 职场文书
优秀党员先进事迹材料
2014/12/18 职场文书
学校清洁工岗位职责
2015/04/15 职场文书
复兴之路纪录片观后感
2015/06/02 职场文书
幼儿园开学家长寄语(2016春季)
2015/12/03 职场文书
创业计划书之香辣虾火锅
2019/09/23 职场文书
浅谈python数据类型及其操作
2021/05/25 Python
试了下Golang实现try catch的方法
2021/07/01 Golang