解析Python中的生成器及其与迭代器的差异

 更新时间:2016年06月20日 16:58:54   作者:catHeart  
生成器是一种特殊的迭代器,而反过来说则就不对了,迭代器在Python中是一个更抽象的概念,以下我们就来详细解析Python中的生成器及其与迭代器的差异

生成器
生成器是一种迭代器,是一种特殊的函数,使用yield操作将函数构造成迭代器。普通的函数有一个入口,有一个返回值;当函数被调用时,从入口开始执行,结束时返回相应的返回值。生成器定义的函数,有多个入口和多个返回值;对生成器执行next()操作,进行生成器的入口开始执行代码,yield操作向调用者返回一个值,并将函数挂起;挂起时,函数执行的环境和参数被保存下来;对生成器执行另一个next()操作时,参数从挂起状态被重新调用,进入上次挂起的执行环境继续下面的操作,到下一个yield操作时重复上面的过程。Python的循环操作与C语言的实现不同,如果使用List等数据结构需要耗费大量的内容;循环操作中使用生成器只需要在内存中实例化一个对象,可以减少内存占用,提高循环操作的执行速度。

>>>def myG():
...  yield 1
...  yield 2
...  yield 3
...
>>>g=myG()
>>>next(g)
1
>>>next(g)
2
>>>next(g)
3
>>>next(g)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
StopIteration
>>>g2=myG()
>>>for i in g2:
...  print(i)
1
2
3

生成器表达式
for...[if]...语句可以简洁的构建一个List,同时也可以用来构建生成器。

>>>a=[7,8,9]
>>>b=[i**2 for i in a]
>>>b
[49, 64, 81]
>>>ib=(i**2 for i in a)
>>>ib
<generator object <genexpr> at 0x7f72291217e0>
>>>next(ib)
49
>>>next(ib)
64
>>>next(ib)
81
>>>next(ib)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
StopIteration

迭代器(Iterator)与生成器(Generator)的区别
迭代器是一个更抽象的概念,任何对象,如果它的类有next方法(next python3)和iter方法返回自己本身。

每个生成器都是一个迭代器,但是反过来不行。通常生成器是通过调用一个或多个yield表达式构成的函数s生成的。同时满足迭代器的定义。

当你需要一个类除了有生成器的特性之外还要有一些自定义的方法时,可以使用自定义的迭代器,一般来说生成器更方便,更简单。

def squares(start, stop):
  for i in xrange(start, stop):
    yield i*i

等同于生成器表达式:

(i*i for i in xrange(start, stop))

列表推倒式是:

[i*i for i in xrange(start, stop)]

如果是构建一个自定义的迭代器:

class Squares(object):
  def __init__(self, start, stop):
    self.start = start
    self.stop = stop
  def __iter__(self):
    return self
  def next(self):
    if self.start >= self.stop:
      raise StopIteration
    current = self.start * self.start
    self.start += 1
    return current

此时,你还可以定义自己的方法如:

def current(self):
  return self.start

两者的相同点:对象迭代完后就不能重写迭代了。

相关文章

  • Python基于LightGBM进行时间序列预测

    Python基于LightGBM进行时间序列预测

    LightGBM是扩展机器学习系统。是一款基于GBDT(梯度提升决策树)算法的分布梯度提升框架。其设计思路主要集中在减少数据对内存与计算性能的使用上,以及减少多机器并行计算时的通讯代价。本文将通过LightGBM进行时间序列预测,感兴趣的可以了解一下
    2022-03-03
  • 4行Python代码生成图像验证码(2种)

    4行Python代码生成图像验证码(2种)

    这篇文章主要介绍了4行Python代码生成图像验证码(2种),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Python自动化测试pytest中fixtureAPI简单说明

    Python自动化测试pytest中fixtureAPI简单说明

    这篇文章主要为大家介绍了Python自动化测试pytest中fixtureAPI的简单说明,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-10-10
  • Python进行密码学反向密码教程

    Python进行密码学反向密码教程

    这篇文章主要为大家介绍了Python进行密码学反向密码的教程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Python3使用PyQt5制作简单的画板/手写板实例

    Python3使用PyQt5制作简单的画板/手写板实例

    下面小编就为大家带来一篇Python3使用PyQt5制作简单的画板/手写板实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Python编程实现的图片识别功能示例

    Python编程实现的图片识别功能示例

    这篇文章主要介绍了Python编程实现的图片识别功能,涉及Python PIL模块的安装与使用技巧,需要的朋友可以参考下
    2017-08-08
  • python实现全盘扫描搜索功能的方法

    python实现全盘扫描搜索功能的方法

    今天小编就为大家分享一篇python实现全盘扫描搜索功能的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-02-02
  • Python操作MongoDB详解及实例

    Python操作MongoDB详解及实例

    这篇文章主要介绍了Python操作MongoDB详解及实例的相关资料,需要的朋友可以参考下
    2017-05-05
  • 使用Python实现视频封面批量下载器

    使用Python实现视频封面批量下载器

    在视频网站上,每个视频都有一个独特的封面图像,本文主要为大家详细如何使用Python编写一个视频封面批量下载器,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-04-04
  • Django切换数据库和迁移数据详解

    Django切换数据库和迁移数据详解

    这篇文章主要介绍了Django切换数据库和迁移数据详解的相关资料,需要的朋友可以参考下
    2022-11-11

最新评论