解析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 os模块中的isfile()和isdir()函数均返回false问题解决方法
Feb 04 Python
解决Linux系统中python matplotlib画图的中文显示问题
Jun 15 Python
详解 Python中LEGB和闭包及装饰器
Aug 03 Python
Python实现PS滤镜的万花筒效果示例
Jan 23 Python
Python3.4学习笔记之列表、数组操作示例
Mar 01 Python
python3中pip3安装出错,找不到SSL的解决方式
Dec 12 Python
Python图像处理二值化方法实例汇总
Jul 24 Python
Python实现Word文档转换Markdown的示例
Dec 22 Python
python日志通过不同的等级打印不同的颜色(示例代码)
Jan 13 Python
怎么用Python识别手势数字
Jun 07 Python
Python内置数据结构列表与元组示例详解
Aug 04 Python
Python Pandas读取Excel日期数据的异常处理方法
Feb 28 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
一个改进的UBB类
2006/10/09 PHP
php性能优化分析工具XDebug 大型网站调试工具
2011/05/22 PHP
PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-1 开始了解php
2011/07/03 PHP
在项目中寻找代码的坏命名
2012/07/14 PHP
Linux下PHP连接Oracle数据库
2014/08/20 PHP
PHP实现获取文件后缀名的几种常用方法
2015/08/08 PHP
判断用户是否在线的代码
2011/03/05 Javascript
JavaScript中创建对象和继承示例解读
2014/02/12 Javascript
JavaScript实现把数字转换成中文
2015/06/29 Javascript
浅谈Javascript线程及定时机制
2015/07/02 Javascript
JS+CSS实现的经典圆角下拉菜单效果代码
2015/10/21 Javascript
AngularJS教程之MVC体系结构详解
2016/08/16 Javascript
详解webpack 如何集成第三方js库
2017/06/29 Javascript
Node.js  REPL (交互式解释器)实例详解
2017/08/06 Javascript
Canvas放置反弹效果随机图形(实例)
2017/08/17 Javascript
vue axios 表单提交上传图片的实例
2018/03/16 Javascript
微信小程序左滑动显示菜单功能的实现
2018/06/14 Javascript
json数据格式常见操作示例
2019/06/13 Javascript
JavaScript实现手风琴效果
2021/02/18 Javascript
跟老齐学Python之模块的加载
2014/10/24 Python
Python实现的KMeans聚类算法实例分析
2018/12/29 Python
Python基于Opencv来快速实现人脸识别过程详解(完整版)
2019/07/11 Python
python3反转字符串的3种方法(小结)
2019/11/07 Python
Python开发企业微信机器人每天定时发消息实例
2020/03/17 Python
Python之字典对象的几种创建方法
2020/09/30 Python
python 实时调取摄像头的示例代码
2020/11/25 Python
英国最大的奢侈珠宝和手表网站:C W Sellors
2017/02/10 全球购物
美国婚戒购物网站:Anjays Designs
2017/06/28 全球购物
美国最好的保健品打折网店:Swanson
2017/08/04 全球购物
红色连衣裙精品店:Red Dress Boutique
2018/08/11 全球购物
JAVA软件工程师测试题
2014/07/25 面试题
中英文自我评价语句
2013/12/20 职场文书
2014年组织委员工作总结
2014/12/01 职场文书
不尊敬老师的检讨书
2014/12/21 职场文书
超市员工辞职信范文
2015/05/12 职场文书
公司催款律师函
2015/05/27 职场文书