解析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 相关文章推荐
pyhton列表转换为数组的实例
Apr 04 Python
利用python如何处理百万条数据(适用java新手)
Jun 06 Python
python判断设备是否联网的方法
Jun 29 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
Apr 11 Python
python字典一键多值实例代码分享
Jun 14 Python
详解numpy.meshgrid()方法使用
Aug 01 Python
python excel转换csv代码实例
Aug 26 Python
Python+Tensorflow+CNN实现车牌识别的示例代码
Oct 11 Python
python中的测试框架
Nov 13 Python
Python机器学习之KNN近邻算法
May 14 Python
python爬取网页版QQ空间,生成各类图表
Jun 02 Python
Python使用Beautiful Soup(BS4)库解析HTML和XML
Jun 05 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/03/27 PHP
PHP常用的排序和查找算法
2015/08/06 PHP
php生成唯一数字id的方法汇总
2015/11/18 PHP
PC端微信扫码支付成功之后自动跳转php版代码
2017/07/07 PHP
基于PHP的微信公众号的开发流程详解
2020/08/07 PHP
js几个不错的函数 $$()
2006/10/09 Javascript
JS 巧妙获取剪贴板数据 Excel数据的粘贴
2009/07/09 Javascript
Jquery中获取iframe的代码
2011/01/11 Javascript
JS实现淘宝支付宝网站的控制台菜单效果
2015/09/28 Javascript
详解Angular Reactive Form 表单验证
2017/07/06 Javascript
js 将canvas生成图片保存,或直接保存一张图片的实现方法
2018/01/02 Javascript
React之PureComponent的使用作用
2018/07/10 Javascript
vue弹窗组件的实现示例代码
2018/09/10 Javascript
解决微信小程序调用moveToLocation失效问题【超简单】
2019/04/12 Javascript
微信小程序实现的一键连接wifi功能示例
2019/04/24 Javascript
浅谈Express.js解析Post数据类型的正确姿势
2019/05/30 Javascript
[42:34]VP vs VG 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
多线程爬虫批量下载pcgame图片url 保存为xml的实现代码
2013/01/17 Python
java中的控制结构(if,循环)详解
2019/06/26 Python
Python爬虫 批量爬取下载抖音视频代码实例
2019/08/16 Python
关于PyTorch 自动求导机制详解
2019/08/18 Python
python selenium自动化测试框架搭建的方法步骤
2020/06/14 Python
解决python父线程关闭后子线程不关闭问题
2020/04/25 Python
英国办公用品商店:Office Outlet
2018/04/04 全球购物
瑞士隐形眼镜和护理产品网上商店:Linsenklick
2019/10/21 全球购物
便利店投资的创业计划书
2014/01/12 职场文书
求职信的最佳写作思路
2014/02/01 职场文书
学生安全责任书
2014/04/15 职场文书
小学生美德少年事迹材料
2014/08/24 职场文书
学生未请假就回家检讨书
2014/09/22 职场文书
省委召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
2015年元旦促销方案书
2014/12/09 职场文书
文明礼仪主题班会
2015/08/13 职场文书
2016国培学习心得体会
2016/01/08 职场文书
大学生心理健康教育心得体会
2016/01/12 职场文书
《王者天下》第4季首话新剧照 4月9日正式开播
2022/04/07 日漫