Python生成器常见问题及解决方案


Posted in Python onMarch 21, 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]

上述代码表明,可以临时改变i从而让生成器发生改变。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
linux 下实现python多版本安装实践
Nov 18 Python
python对html代码进行escape编码的方法
May 04 Python
详解TensorFlow在windows上安装与简单示例
Mar 05 Python
Python 使用PIL numpy 实现拼接图片的示例
May 08 Python
selenium+python环境配置教程详解
May 28 Python
python字符串替换第一个字符串的方法
Jun 26 Python
pytorch 固定部分参数训练的方法
Aug 17 Python
python接口自动化如何封装获取常量的类
Dec 24 Python
Python打开文件、文件读写操作、with方式、文件常用函数实例分析
Jan 07 Python
Python3查找列表中重复元素的个数的3种方法详解
Feb 13 Python
TensorFlow使用Graph的基本操作的实现
Apr 22 Python
基于Python编写一个监控CPU的应用系统
Jun 25 Python
Python作用域与名字空间原理详解
Mar 21 #Python
Python小整数对象池和字符串intern实例解析
Mar 21 #Python
Python描述符descriptor使用原理解析
Mar 21 #Python
Python如何省略括号方法详解
Mar 21 #Python
Python如何使用bokeh包和geojson数据绘制地图
Mar 21 #Python
Spring Boot中使用IntelliJ IDEA插件EasyCode一键生成代码详细方法
Mar 20 #Python
python+opencv实现移动侦测(帧差法)
Mar 20 #Python
You might like
站长助手-网站web在线管理程序 v1.0 下载
2007/05/12 PHP
php错误、异常处理机制(补充)
2012/05/07 PHP
重新认识php array_merge函数
2014/08/31 PHP
Javascript下的keyCode键码值表
2007/04/10 Javascript
jquery 插件 人性化的消息显示
2008/01/21 Javascript
JavaScript几种形式的树结构菜单
2010/05/10 Javascript
jquery调用wcf并展示出数据的方法
2011/07/07 Javascript
js 代码优化点滴记录
2012/02/19 Javascript
Egret引擎开发指南之视觉编程
2014/09/03 Javascript
微信小程序 Record API详解及实例代码
2016/09/30 Javascript
微信小程序 WXML、WXSS 和JS介绍及详解
2016/10/08 Javascript
如何将 jQuery 从你的 Bootstrap 项目中移除(取而代之使用Vue.js)
2017/07/17 jQuery
react-native 完整实现登录功能的示例代码
2017/09/11 Javascript
详解React 在服务端渲染的实现
2017/11/16 Javascript
jquery实现左右轮播切换效果
2018/01/01 jQuery
微信小程序判断页面是否从其他页面返回的实例代码
2019/07/03 Javascript
Python设计模式之观察者模式实例
2014/04/26 Python
python中pygame模块用法实例
2014/10/09 Python
Python简单的制作图片验证码实例
2017/05/31 Python
python调用Delphi写的Dll代码示例
2017/12/05 Python
深入理解Python爬虫代理池服务
2018/02/28 Python
python实现顺序表的简单代码
2018/09/28 Python
python os.listdir按文件存取时间顺序列出目录的实例
2018/10/21 Python
python装饰器代替set get方法实例
2019/12/19 Python
Python使用GitPython操作Git版本库的方法
2020/02/29 Python
浅谈keras中Dropout在预测过程中是否仍要起作用
2020/07/09 Python
Python限制内存和CPU使用量的方法(Unix系统适用)
2020/08/04 Python
canvas版人体时钟的实现示例
2021/01/29 HTML / CSS
编码实现字符串转整型的函数
2012/06/02 面试题
食品营养与检测应届生求职信
2013/11/08 职场文书
师德标兵事迹材料
2014/12/19 职场文书
创先争优个人总结
2015/03/04 职场文书
欠款证明
2015/06/24 职场文书
入团申请书格式
2019/06/20 职场文书
如何有效防止sql注入的方法
2021/05/25 SQL Server
Django操作cookie的实现
2021/05/26 Python