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

 更新时间:2020年03月21日 12:48:56   作者:luoheng  
这篇文章主要介绍了Python生成器常见问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

在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鸭子类型相关原理

    这篇文章主要介绍了通过案例解析python鸭子类型相关原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • Python之批量创建文件的实例讲解

    Python之批量创建文件的实例讲解

    今天小编就为大家分享一篇Python之批量创建文件的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • 浅谈Python脚本开头及导包注释自动添加方法

    浅谈Python脚本开头及导包注释自动添加方法

    今天小编就为大家分享一篇浅谈Python脚本开头及导包注释自动添加方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • python实现图片文件批量重命名

    python实现图片文件批量重命名

    这篇文章主要为大家详细介绍了python实现图片文件批量重命名,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • 深入讲解Java编程中类的生命周期

    深入讲解Java编程中类的生命周期

    这篇文章主要介绍了深入讲解Java编程中类的生命周期,在带有垃圾回收功能的Java虚拟机上运行的程序中类的生命周期就显得格外重要,需要的朋友可以参考下
    2016-02-02
  • Python图像处理之图像金字塔的向上和向下取样

    Python图像处理之图像金字塔的向上和向下取样

    图像金字塔是指由一组图像且不同分别率的子图集合,它是图像多尺度表达的一种,以多分辨率来解释图像的结构,主要用于图像的分割或压缩。本文主要介绍了图像金字塔的图像向下取样和向上取样,感兴趣的可以了解一下
    2022-09-09
  • Python图像处理之图像拼接

    Python图像处理之图像拼接

    这篇文章主要介绍了Python图像处理之图像拼接,文中有非常详细的代码示例,对正在学习python图像处理的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • Python一文入门Flask Blueprint SQLAlchemy部分详解

    Python一文入门Flask Blueprint SQLAlchemy部分详解

    这篇文章主要为大家介绍了Python一文入门Flask Blueprint SQLAlchemy部分详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Python入门篇之字符串

    Python入门篇之字符串

    可能大多数人在学习C语言的时候,最先接触的数据类型就是字符串,因为大多教程都是以"Hello world"这个程序作为入门程序,这个程序中要打印的"Hello world"就是字符串。今天我们来了解一下Python中的字符串,看看它的用法。
    2014-10-10
  • Python 如何获取目录下的文件列表,并自然排序

    Python 如何获取目录下的文件列表,并自然排序

    这篇文章主要介绍了Python 如何获取目录下的文件列表,并自然排序的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05

最新评论