解析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类的基础入门知识
Nov 24 Python
python获取当前用户的主目录路径方法(推荐)
Jan 12 Python
python基于http下载视频或音频
Jun 20 Python
python3将视频流保存为本地视频文件
Jun 20 Python
python计算两个数的百分比方法
Jun 29 Python
Django中使用Celery的教程详解
Aug 24 Python
对Python中DataFrame选择某列值为XX的行实例详解
Jan 29 Python
Python3之手动创建迭代器的实例代码
May 22 Python
在python中用url_for构造URL的方法
Jul 25 Python
Django实现随机图形验证码的示例
Oct 15 Python
编写python代码实现简单抽奖器
Oct 20 Python
python上下文管理器异常问题解决方法
Feb 07 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字符串替换函数substr_replace()用法实例
2015/03/17 PHP
php简单socket服务器客户端代码实例
2015/05/18 PHP
jquery+thinkphp实现跨域抓取数据的方法
2016/10/15 PHP
EXT中xtype的含义分析
2010/01/07 Javascript
网站页面自动跳转实现方法PHP、JSP(上)
2010/08/01 Javascript
20个最新的jQuery插件
2012/01/13 Javascript
ExtJS4中使用mixins实现多继承示例
2013/12/03 Javascript
javascript框架设计读书笔记之种子模块
2014/12/02 Javascript
使用vue.js开发时一些注意事项
2016/04/27 Javascript
原生JS封装ajax 传json,str,excel文件上传提交表单(推荐)
2016/06/21 Javascript
JS实现刷新父页面不弹出提示框的方法
2016/06/22 Javascript
Json解析的方法小结
2016/06/22 Javascript
node.js学习之base64编码解码
2016/10/21 Javascript
jQuery实现自动调用和触发某个事件的方法
2016/11/18 Javascript
简单实现jquery隔行变色
2017/11/09 jQuery
微信小程序 功能函数小结(手机号验证*、密码验证*、获取验证码*)
2017/12/08 Javascript
vue+element+Java实现批量删除功能
2019/04/08 Javascript
小程序实现录音上传功能
2019/11/22 Javascript
如何通过JS实现日历简单算法
2020/10/14 Javascript
python操作数据库之sqlite3打开数据库、删除、修改示例
2014/03/13 Python
Python中让MySQL查询结果返回字典类型的方法
2014/08/22 Python
python openvc 裁剪、剪切图片 提取图片的行和列
2019/09/19 Python
详解python中*号的用法
2019/10/21 Python
使用matplotlib动态刷新指定曲线实例
2020/04/23 Python
CSS3实战第一波 让我们尽情的圆角吧
2010/08/27 HTML / CSS
html5贪吃蛇游戏使用63行代码完美实现
2013/06/25 HTML / CSS
html5各种页面切换效果和模态对话框用法总结
2014/12/15 HTML / CSS
关于解决iframe标签嵌套问题的解决方法
2020/03/04 HTML / CSS
使用layui框架实现点击左侧导航切换右侧内容且右侧选项卡跟随变化的效果
2020/11/10 HTML / CSS
新西兰杂志订阅:isubscribe
2019/08/26 全球购物
师范毕业生求职自荐信
2013/09/25 职场文书
农业大学毕业生的个人自我评价
2013/10/11 职场文书
新驾驶员个人自我评价
2014/01/03 职场文书
中华魂演讲稿
2014/05/13 职场文书
2015教师年度思想工作总结
2015/04/30 职场文书
SQL Server 中的事务介绍
2022/05/20 SQL Server