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


Posted in Python onJune 20, 2016

生成器
生成器是一种迭代器,是一种特殊的函数,使用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 相关文章推荐
python编程实现归并排序
Apr 14 Python
浅谈python import引入不同路径下的模块
Jul 11 Python
tensorflow创建变量以及根据名称查找变量
Mar 10 Python
Python中__slots__属性介绍与基本使用方法
Sep 05 Python
python爬取淘宝商品销量信息
Nov 16 Python
python利用多种方式来统计词频(单词个数)
May 27 Python
python3实现带多张图片、附件的邮件发送
Aug 10 Python
python 模拟创建seafile 目录操作示例
Sep 26 Python
浅谈python中统计计数的几种方法和Counter详解
Nov 07 Python
Python3操作YAML文件格式方法解析
Apr 10 Python
利用Python函数实现一个万历表完整示例
Jan 23 Python
Python爬虫数据的分类及json数据使用小结
Mar 29 Python
Python判断列表是否已排序的各种方法及其性能分析
Jun 20 #Python
Python编程中装饰器的使用示例解析
Jun 20 #Python
12步入门Python中的decorator装饰器使用方法
Jun 20 #Python
深入学习Python中的装饰器使用
Jun 20 #Python
Python中Iterator迭代器的使用杂谈
Jun 20 #Python
实例讲解Python编程中@property装饰器的用法
Jun 20 #Python
Python的包管理器pip更换软件源的方法详解
Jun 20 #Python
You might like
php实现图片局部打马赛克的方法
2015/02/11 PHP
详解php中serialize()和unserialize()函数
2017/07/08 PHP
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
2018/04/20 PHP
php中对象引用和复制实例分析
2019/08/14 PHP
在Iframe中获取父窗口中表单的值(示例代码)
2013/11/22 Javascript
jQuery中:only-child选择器用法实例
2015/01/03 Javascript
js获取及修改网页背景色和字体色的方法
2015/12/29 Javascript
JavaScript和jquery获取父级元素、子级元素、兄弟元素的方法
2016/06/05 Javascript
nodejs中模块定义实例详解
2017/03/18 NodeJs
Ajax异步文件上传与NodeJS express服务端处理
2017/04/01 NodeJs
vue组件中点击按钮后修改输入框的状态实例代码
2017/04/14 Javascript
Vue Cli与BootStrap结合实现表格分页功能
2017/08/18 Javascript
Nodejs 复制文件/文件夹的方法
2017/08/24 NodeJs
iview给radio按钮组件加点击事件的实例
2017/09/30 Javascript
详细介绍解决vue和jsp结合的方法
2020/02/06 Javascript
基于better-scroll 实现歌词联动功能的代码
2020/05/07 Javascript
基于JavaScript或jQuery实现网站夜间/高亮模式
2020/05/30 jQuery
python从sqlite读取并显示数据的方法
2015/05/08 Python
Python的爬虫程序编写框架Scrapy入门学习教程
2016/07/02 Python
python如何为被装饰的函数保留元数据
2018/03/21 Python
python画折线图的程序
2018/07/26 Python
python生成九宫格图片
2018/11/19 Python
python 运用Django 开发后台接口的实例
2018/12/11 Python
在python中实现强制关闭线程的示例
2019/01/22 Python
基于python的itchat库实现微信聊天机器人(推荐)
2019/10/29 Python
windows、linux下打包Python3程序详细方法
2020/03/17 Python
解决Pyinstaller打包软件失败的一个坑
2021/03/04 Python
4s客服专员岗位职责
2013/12/01 职场文书
积极分子思想汇报
2014/01/04 职场文书
护理个人求职信范文
2014/01/08 职场文书
2014离婚协议书范文两篇
2014/09/15 职场文书
员工工作自我评价
2014/09/26 职场文书
2015年办公室文秘工作总结
2015/04/30 职场文书
转学证明范本
2015/06/19 职场文书
总结会主持词
2015/07/02 职场文书
python通配符之glob模块的使用详解
2021/04/24 Python