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实现的Google IP 可用性检测脚本
Apr 23 Python
Python标准库之Sys模块使用详解
May 23 Python
Python实现的彩票机选器实例
Jun 17 Python
Python 数据结构之队列的实现
Jan 22 Python
python和flask中返回JSON数据的方法
Mar 26 Python
python实现反转部分单向链表
Sep 27 Python
Python3 安装PyQt5及exe打包图文教程
Jan 08 Python
Python 等分切分数据及规则命名的实例代码
Aug 16 Python
Ubuntu16.04安装python3.6.5步骤详解
Jan 10 Python
Python爬虫程序架构和运行流程原理解析
Mar 09 Python
tensorflow中的数据类型dtype用法说明
May 26 Python
python中tkinter复选框使用操作
Nov 11 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下载xls文件(自己动手写的)
2014/04/18 PHP
php查找字符串出现次数的方法
2014/12/01 PHP
php找出指定范围内回文数且平方根也是回文数的方法
2015/03/23 PHP
抛弃 PHP 代价太高
2016/04/26 PHP
PHP面向对象程序设计之构造方法和析构方法详解
2019/06/13 PHP
php+layui数据表格实现数据分页渲染代码
2019/10/26 PHP
escape、encodeURI、encodeURIComponent等方法的区别比较
2006/12/27 Javascript
jQuery中:gt选择器用法实例
2014/12/29 Javascript
Javascript核心读书有感之语言核心
2015/02/01 Javascript
使用vue.js开发时一些注意事项
2016/04/27 Javascript
浅析Bootstrip的select控件绑定数据的问题
2016/05/10 Javascript
js html css实现复选框全选与反选
2016/10/09 Javascript
解析NodeJs的调试方法
2016/12/11 NodeJs
详解Vue.js基于$.ajax获取数据并与组件的data绑定
2017/05/26 Javascript
基于js 本地存储(详解)
2017/08/16 Javascript
解决VUE中document.body.scrollTop为0的问题
2018/09/15 Javascript
JavaScript(js)处理的HTML事件、键盘事件、鼠标事件简单示例
2019/11/19 Javascript
vue element 中的table动态渲染实现(动态表头)
2019/11/21 Javascript
JS如何判断对象是否包含某个属性
2020/08/29 Javascript
[01:59]游戏“zheng”当时试玩会
2019/08/21 DOTA
Python读取mp3中ID3信息的方法
2015/03/05 Python
python解决方案:WindowsError: [Error 2]
2016/08/28 Python
python查看列的唯一值方法
2018/07/17 Python
python面向对象法实现图书管理系统
2019/04/19 Python
python  文件的基本操作 菜中菜功能的实例代码
2019/07/17 Python
From CSV to SQLite3 by python 导入csv到sqlite实例
2020/02/14 Python
基于pytorch padding=SAME的解决方式
2020/02/18 Python
Python使用sqlite3模块内置数据库
2020/05/07 Python
基于Keras中Conv1D和Conv2D的区别说明
2020/06/19 Python
草莓网英国官网:Strawberrynet UK
2017/02/12 全球购物
编程实现去掉XML的重复结点
2014/05/28 面试题
教师拔河比赛广播稿
2014/10/14 职场文书
大学生就业意向书
2015/05/11 职场文书
新闻稿件写作范文
2015/07/18 职场文书
JavaScript实现复选框全选功能
2021/04/11 Javascript
python操作xlsx格式文件并读取
2021/06/02 Python