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 3.7.0 下pillow安装方法
Aug 27 Python
CentOS 7 安装python3.7.1的方法及注意事项
Nov 01 Python
Python3爬虫之urllib携带cookie爬取网页的方法
Dec 28 Python
详解Django项目中模板标签及模板的继承与引用(网站中快速布置广告)
Mar 27 Python
Python pandas.DataFrame 找出有空值的行
Sep 09 Python
python conda操作方法
Sep 11 Python
python读取多层嵌套文件夹中的文件实例
Feb 27 Python
Python 代码调试技巧示例代码
Aug 11 Python
Python脚本实现Zabbix多行日志监控过程解析
Aug 26 Python
Python批量获取并保存手机号归属地和运营商的示例
Oct 09 Python
python爬虫利用selenium实现自动翻页爬取某鱼数据的思路详解
Dec 22 Python
如何通过一篇文章了解Python中的生成器
Apr 02 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
使用 php4 加速 web 传输
2006/10/09 PHP
PHP 截取字符串专题集合
2010/08/19 PHP
php结合安卓客户端实现查询交互实例
2015/05/05 PHP
php中替换字符串函数strtr()和str_repalce()的用法与区别
2016/11/25 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
2020/03/24 PHP
jQuery编写widget的一些技巧分享
2010/10/28 Javascript
jquery jqPlot API 中文使用教程(非常强大的图表工具)
2011/08/15 Javascript
一个简单的网站访问JS计数器 刷新1次加1次访问
2012/09/20 Javascript
jQuery修改class属性和CSS样式整理
2015/01/30 Javascript
jQuery实现鼠标经过图片变亮其他变暗效果
2015/05/08 Javascript
bootstrap导航栏、下拉菜单、表单的简单应用实例解析
2017/01/06 Javascript
jquery实现数字输入框
2017/02/22 Javascript
详解使用nodeJs安装Vue-cli
2017/05/17 NodeJs
JS实现的计数排序与基数排序算法示例
2017/12/04 Javascript
JS获取指定月份的天数两种实现方法
2018/06/22 Javascript
JS大坑之19位数的Number型精度丢失问题详解
2019/04/22 Javascript
ES6中Symbol、Set和Map用法详解
2019/08/20 Javascript
深入探索VueJS Scoped CSS 实现原理
2019/09/23 Javascript
vue 使用v-for进行循环的实例代码详解
2020/02/19 Javascript
JS forEach跳出循环2种实现方法
2020/06/24 Javascript
[01:57]2016完美“圣”典风云人物:国士无双专访
2016/12/04 DOTA
Python获取Windows或Linux主机名称通用函数分享
2014/11/22 Python
Python中使用装饰器时需要注意的一些问题
2015/05/11 Python
使用paramiko远程执行命令、下发文件的实例
2017/10/01 Python
python PyTorch预训练示例
2018/02/11 Python
快速解决pandas.read_csv()乱码的问题
2018/06/15 Python
Django渲染Markdown文章目录的方法示例
2019/01/02 Python
Jupyter notebook在mac:linux上的配置和远程访问的方法
2019/01/14 Python
详解Python Qt的窗体开发的基本操作
2019/07/14 Python
Python PyQt5整理介绍
2020/04/01 Python
新加坡交友网站:be2新加坡
2019/04/10 全球购物
后备干部考察材料
2014/02/12 职场文书
体育课课后反思
2014/04/24 职场文书
环保口号大全
2014/06/12 职场文书
2014年小学安全工作总结
2014/12/04 职场文书