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 相关文章推荐
利用Python的装饰器解决Bottle框架中用户验证问题
Apr 24 Python
Python实现将文本生成二维码的方法示例
Jul 18 Python
Python时间的精准正则匹配方法分析
Aug 17 Python
详解Python自建logging模块
Jan 29 Python
python pandas 对series和dataframe的重置索引reindex方法
Jun 07 Python
对python list 遍历删除的正确方法详解
Jun 29 Python
浅谈python写入大量文件的问题
Nov 09 Python
python 检查文件mime类型的方法
Dec 08 Python
详解Django admin高级用法
Nov 06 Python
python numpy中setdiff1d的用法说明
Apr 22 Python
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
Jun 11 Python
python实现A*寻路算法
Jun 13 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
PHP常用特殊运算符号和函数总结(php新手入门必看)
2013/02/02 PHP
php文字水印和php图片水印实现代码(二种加水印方法)
2013/12/25 PHP
php实现parent调用父类的构造方法与被覆写的方法
2015/02/11 PHP
PHP实现163邮箱自动发送邮件
2016/03/29 PHP
PHP在线打包下载功能示例
2016/10/15 PHP
php生成二维码不保存服务器还有下载功能的实现代码
2018/08/09 PHP
Laravel等框架模型关联的可用性浅析
2019/12/15 PHP
Array.prototype.slice.apply的使用方法
2010/03/17 Javascript
AngularJS语法详解(续)
2015/01/23 Javascript
理解JavaScript原型链
2016/10/25 Javascript
基于Vue实例生命周期(全面解析)
2017/08/16 Javascript
jQuery选择器之属性筛选选择器用法详解
2017/09/19 jQuery
Validform验证时可以为空否则按照指定格式验证
2017/10/20 Javascript
vue+swiper实现组件化开发的实例代码
2017/10/26 Javascript
JS实现遍历不规则多维数组的方法
2018/03/21 Javascript
深入理解Vue keep-alive及实践总结
2019/08/21 Javascript
小程序两种滚动公告栏的实现方法
2019/09/17 Javascript
JQuery省市联动效果实现过程详解
2020/05/08 jQuery
[49:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第二场 3月4日
2021/03/11 DOTA
python重试装饰器示例
2014/02/11 Python
六个窍门助你提高Python运行效率
2015/06/09 Python
Python字符串拼接六种方法介绍
2017/12/18 Python
Python基于whois模块简单识别网站域名及所有者的方法
2018/04/23 Python
flask框架使用orm连接数据库的方法示例
2018/07/16 Python
pyqt5之将textBrowser的内容写入txt文档的方法
2019/06/21 Python
django中forms组件的使用与注意
2019/07/08 Python
Pytorch对Himmelblau函数的优化详解
2020/02/29 Python
荷兰之家英文站:Holland at Home
2016/10/26 全球购物
Jabra捷波朗美国官网:用于办公、车载和运动的无线蓝牙耳麦
2017/02/01 全球购物
草莓巧克力:Shari’s Berries
2017/02/07 全球购物
您在慕尼黑的跑步商店:Lauf-bar
2019/10/11 全球购物
优秀班干部事迹材料
2014/01/26 职场文书
《商鞅南门立木》教学反思
2014/02/16 职场文书
门面房租房协议书
2014/08/20 职场文书
2016年党员公开承诺书格式范文
2016/03/24 职场文书
为什么说餐饮很难做,是因为你不了解这些新规则
2019/08/20 职场文书