解析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操作CouchDB数据库简单示例
Mar 10 Python
Python字典实现简单的三级菜单(实例讲解)
Jul 31 Python
python中的计时器timeit的使用方法
Oct 20 Python
Python简单计算数组元素平均值的方法示例
Dec 26 Python
python利用高阶函数实现剪枝函数
Mar 20 Python
Python实现判断给定列表是否有重复元素的方法
Apr 11 Python
python爬取网易云音乐评论
Nov 16 Python
Python+AutoIt实现界面工具开发过程详解
Aug 07 Python
python绘制随机网络图形示例
Nov 21 Python
如何解决tensorflow恢复模型的特定值时出错
Feb 06 Python
JAVA及PYTHON质数计算代码对比解析
Jun 10 Python
Python多线程threading创建及使用方法解析
Jun 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判断文章里是否有图片的简单方法
2014/07/26 PHP
Symfony生成二维码的方法
2016/02/04 PHP
PHP读取、解析eml文件及生成网页的方法示例
2017/09/04 PHP
PHP5中使用mysqli的prepare操作数据库的介绍
2019/03/18 PHP
IE8 引入跨站数据获取功能说明
2008/07/22 Javascript
passwordStrength 基于jquery的密码强度检测代码使用介绍
2011/10/08 Javascript
javascript:void(0)的作用示例介绍
2013/10/28 Javascript
jquery实现兼容IE8的异步上传文件
2015/06/15 Javascript
JavaScript动态设置div的样式的方法
2015/12/26 Javascript
JS判断字符串变量是否含有某个字串的实现方法
2016/06/03 Javascript
js常用的继承--组合式继承
2017/03/06 Javascript
JS实现浏览上传文件的代码
2017/08/23 Javascript
详解在vue-cli项目中使用mockjs(请求数据删除数据)
2017/10/23 Javascript
基于vue-cli配置lib-flexible + rem实现移动端自适应
2017/12/26 Javascript
小程序图片长按识别功能的实现方法
2018/08/30 Javascript
详解如何在vue项目中使用layui框架及采坑
2019/05/05 Javascript
Python3.6实现连接mysql或mariadb的方法分析
2018/05/18 Python
修复 Django migration 时遇到的问题解决
2018/06/14 Python
Python使用Pandas读写Excel实例解析
2019/11/19 Python
python编写俄罗斯方块
2020/03/13 Python
python异步Web框架sanic的实现
2020/04/27 Python
Sentry错误日志监控使用方法解析
2020/11/12 Python
python 实现图片裁剪小工具
2021/02/02 Python
Otticanet英国:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/02/10 全球购物
描述Cookie和Session的作用,区别和各自的应用范围,Session工作原理
2015/03/25 面试题
毕业实习评语
2014/02/10 职场文书
致100米运动员广播稿
2014/02/14 职场文书
《学棋》教后反思
2014/04/14 职场文书
中职生自荐信范文
2014/06/15 职场文书
护理学专业求职信
2014/06/29 职场文书
2015毕业寄语大全
2015/02/26 职场文书
员工福利申请报告
2015/05/15 职场文书
领导激励员工的演讲稿,各种会上用得到,建议收藏
2019/08/13 职场文书
导游词之京东大峡谷旅游区
2019/10/29 职场文书
小米11和iphone12哪个值得买?小米11对比iphone12评测
2021/04/21 数码科技
彻底解决MySQL使用中文乱码的方法
2022/01/22 MySQL