解析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 冒泡,选择,插入排序使用实例
Feb 05 Python
Python对CSV、Excel、txt、dat文件的处理
Sep 18 Python
python requests.post带head和body的实例
Jan 02 Python
Pycharm如何打断点的方法步骤
Jun 13 Python
Django项目使用CircleCI的方法示例
Jul 14 Python
django2笔记之路由path语法的实现
Jul 17 Python
Django框架安装方法图文详解
Nov 04 Python
pytorch torch.nn.AdaptiveAvgPool2d()自适应平均池化函数详解
Jan 03 Python
TensorFlow实现指数衰减学习率的方法
Feb 05 Python
如何使用Python处理HDF格式数据及可视化问题
Jun 24 Python
浅析Python requests 模块
Oct 09 Python
python爬虫中抓取指数的实例讲解
Dec 01 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代码重构方法漫谈
2018/04/17 PHP
JavaScript 高效运行代码分析
2010/03/18 Javascript
script的async属性以非阻塞的模式加载脚本
2013/01/15 Javascript
Jquery弹出层插件ThickBox的使用方法
2014/12/09 Javascript
Bootstrap安装环境配置教程分享
2016/05/27 Javascript
Bootstrap基本样式学习笔记之按钮(4)
2016/12/07 Javascript
AngularJS通过ng-route实现基本的路由功能实例详解
2016/12/13 Javascript
webpack配置之后端渲染详解
2017/10/26 Javascript
微信小程序使用canvas的画图操作示例
2019/01/18 Javascript
解决layui的radio属性或别的属性没显示出来的问题
2019/09/26 Javascript
vue+echarts+datav大屏数据展示及实现中国地图省市县下钻功能
2020/11/16 Javascript
原生js 实现表单验证功能
2021/02/08 Javascript
Python运用于数据分析的简单教程
2015/03/27 Python
详解在Python程序中使用Cookie的教程
2015/04/30 Python
Python进程间通信用法实例
2015/06/04 Python
python实现NB-IoT模块远程控制
2018/06/20 Python
python使用turtle库绘制树
2018/06/25 Python
python 使用while写猜年龄小游戏过程解析
2019/10/07 Python
Pyecharts绘制全球流向图的示例代码
2020/01/08 Python
Django静态资源部署404问题解决方案
2020/05/11 Python
Python unittest单元测试openpyxl实现过程解析
2020/05/27 Python
英国香水店:The Perfume Shop
2017/03/27 全球购物
编码实现字符串转整型的函数
2012/06/02 面试题
职专应届生求职信
2013/11/16 职场文书
社区交通安全实施方案
2014/03/22 职场文书
法人委托书范本
2014/04/04 职场文书
教师教学评估方案
2014/05/09 职场文书
产品发布会策划方案
2014/05/12 职场文书
防灾减灾日活动总结
2014/08/26 职场文书
初婚初育证明范本
2014/11/24 职场文书
2015年母亲节活动策划方案
2015/05/04 职场文书
退休欢送会致辞
2015/07/31 职场文书
初中英语教学反思范文
2016/02/15 职场文书
2019年新郎保证书3篇
2019/10/17 职场文书
Python爬虫基础之简单说一下scrapy的框架结构
2021/06/26 Python
Mybatis-Plus进阶分页与乐观锁插件及通用枚举和多数据源详解
2022/03/21 Java/Android