解析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使用urllib模块的urlopen超时问题解决方法
Nov 08 Python
python处理图片之PIL模块简单使用方法
May 11 Python
python+matplotlib绘制旋转椭圆实例代码
Jan 12 Python
Python实现的三层BP神经网络算法示例
Feb 07 Python
python实现根据文件关键字进行切分为多个文件的示例
Dec 10 Python
浅析Windows 嵌入python解释器的过程
Jul 26 Python
python web框架Flask实现图形验证码及验证码的动态刷新实例
Oct 14 Python
python实现密码验证合格程序的思路详解
Jun 01 Python
Django serializer优化类视图的实现示例
Jul 16 Python
python获取淘宝服务器时间的代码示例
Apr 22 Python
Python制作一个随机抽奖小工具的实现
Jul 07 Python
Python Pygame实战之塔防游戏的实现
Mar 17 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 正则匹配函数体
2009/08/25 PHP
PHP中计算字符串相似度的函数代码
2012/12/29 PHP
关于php操作mysql执行数据库查询的一些常用操作汇总
2013/06/24 PHP
PHP排序算法之希尔排序(Shell Sort)实例分析
2018/04/20 PHP
laravel框架查询数据集转为数组的两种方法
2019/10/10 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
javascript unicode与GBK2312(中文)编码转换方法
2013/11/14 Javascript
jQuery的text()方法用法分析
2014/12/20 Javascript
JavaScript使用Replace进行字符串替换的方法
2015/04/14 Javascript
js闭包实现按秒计数
2015/04/23 Javascript
js点击列表文字对应该行显示背景颜色的实现代码
2015/08/05 Javascript
js实现文本框宽度自适应文本宽度的方法
2015/08/13 Javascript
js实现网页多级级联菜单代码
2015/08/20 Javascript
微信小程序 rpx 尺寸单位详细介绍
2016/10/13 Javascript
jquery拼接ajax 的json和字符串拼接的方法
2017/03/11 Javascript
JavaScript实现父子dom同时绑定两个点击事件,一个用捕获,一个用冒泡时执行顺序的方法
2017/03/30 Javascript
基于js文件加载优化(详解)
2018/01/03 Javascript
react.js组件实现拖拽复制和可排序的示例代码
2018/08/20 Javascript
vue中如何实现后台管理系统的权限控制的方法示例
2018/09/19 Javascript
vue通过指令(directives)实现点击空白处收起下拉框
2018/12/06 Javascript
jQuery实现点击滚动到指定元素上的方法分析
2020/03/19 jQuery
python用装饰器自动注册Tornado路由详解
2017/02/14 Python
Python实现抓取网页生成Excel文件的方法示例
2017/08/05 Python
解决Python设置函数调用超时,进程卡住的问题
2019/08/08 Python
TensorFlow索引与切片的实现方法
2019/11/20 Python
opencv-python 读取图像并转换颜色空间实例
2019/12/09 Python
Python字符串格式化f-string多种功能实现
2020/05/07 Python
js实现移动端H5页面手指滑动刻度尺功能
2017/11/16 HTML / CSS
大学生水文观测实习自我鉴定
2013/09/29 职场文书
初中美术教学反思
2014/01/29 职场文书
物流管理专业毕业生自荐信
2014/03/04 职场文书
《乡下孩子》教学反思
2014/04/17 职场文书
工会换届选举方案
2014/05/21 职场文书
奥林匹克运动会口号
2014/06/19 职场文书
禁止酒驾标语
2014/06/25 职场文书
综合素质评价自我评价
2015/03/06 职场文书