解析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入门篇之编程习惯与特点
Oct 17 Python
Python实现提取谷歌音乐搜索结果的方法
Jul 10 Python
在Python程序和Flask框架中使用SQLAlchemy的教程
Jun 06 Python
python生成词云的实现方法(推荐)
Jun 13 Python
使用实现XlsxWriter创建Excel文件并编辑
May 04 Python
Flask框架响应、调度方法和蓝图操作实例分析
Jul 24 Python
Python+OpenCV感兴趣区域ROI提取方法
Jan 10 Python
Python程序包的构建和发布过程示例详解
Jun 09 Python
Python 解码Base64 得到码流格式文本实例
Jan 09 Python
Python虚拟环境的创建和使用详解
Sep 07 Python
Python爬虫过程解析之多线程获取小米应用商店数据
Nov 14 Python
python基于turtle绘制几何图形
Jun 15 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
手把手教你使用DedeCms的采集的图文教程
2007/03/11 PHP
php递归函数中使用return的注意事项
2014/01/17 PHP
php实现简单的语法高亮函数实例分析
2015/04/27 PHP
Thinkphp3.2实用篇之计算型验证码示例
2017/02/09 PHP
利用PHPExcel实现Excel文件的写入和读取
2017/04/26 PHP
Laravel 批量更新多条数据的示例
2017/11/27 PHP
thinkphp5 migrate数据库迁移工具
2018/02/20 PHP
javascript中的数字与字符串相加实例分析
2011/08/14 Javascript
ASP.NET jQuery 实例5 (显示CheckBoxList成员选中的内容)
2012/01/13 Javascript
Javascript中string转date示例代码
2013/11/01 Javascript
仿百度联盟对联广告实现代码
2014/08/30 Javascript
深入探讨javascript函数式编程
2015/10/11 Javascript
js 实现一些跨浏览器的事件方法详解及实例
2016/10/27 Javascript
详解javascript获取url信息的常见方法
2016/12/19 Javascript
JS常见简单正则表达式验证功能小结【手机,地址,企业税号,金额,身份证等】
2017/01/22 Javascript
微信小程序图片自适应支持多图实例详解
2017/06/21 Javascript
AngularJS基于MVC的复杂操作实例讲解
2017/12/31 Javascript
axios取消请求的实践记录分享
2018/09/26 Javascript
小程序实现多列选择器
2019/02/15 Javascript
Vue  webpack 项目自动打包压缩成zip文件的方法
2019/07/24 Javascript
vue.js实现双击放大预览功能
2020/06/23 Javascript
Javascript新手入门之字符串拼接与变量的应用
2020/12/03 Javascript
[00:12]DAC2018 no[o]ne亮相SOLO赛 他是否如他的id一样无人可挡?
2018/04/06 DOTA
Python爬取十篇新闻统计TF-IDF
2018/01/03 Python
在Pandas中给多层索引降级的方法
2018/11/16 Python
python async with和async for的使用
2019/06/20 Python
python matplotlib画盒图、子图解决坐标轴标签重叠的问题
2020/01/19 Python
virtualenv介绍及简明教程
2020/06/23 Python
Python filter()及reduce()函数使用方法解析
2020/09/05 Python
html2 canvas生成清晰的图片实现打印功能
2019/09/23 HTML / CSS
是否有自动比较结构的方法
2015/06/03 面试题
环境工程专业自荐信
2014/03/03 职场文书
天那边观后感
2015/06/09 职场文书
SpringBoot整合RabbitMQ的5种模式实战
2021/08/02 Java/Android
mysql中int(3)和int(10)的数值范围是否相同
2021/10/16 MySQL
windows11选中自动复制怎么开启? Win11自动复制所选内容的方法
2022/07/23 数码科技