解析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 strip lstrip rstrip使用方法
Sep 06 Python
WINDOWS 同时安装 python2 python3 后 pip 错误的解决方法
Mar 16 Python
对numpy的array和python中自带的list之间相互转化详解
Apr 13 Python
django 解决manage.py migrate无效的问题
May 27 Python
Flask框架Flask-Principal基本用法实例分析
Jul 23 Python
使用Python实现一个栈判断括号是否平衡
Aug 23 Python
将pandas.dataframe的数据写入到文件中的方法
Dec 07 Python
Python选择网卡发包及接收数据包
Apr 04 Python
Pandas把dataframe或series转换成list的方法
Jun 14 Python
TensorFlow的环境配置与安装教程详解(win10+GeForce GTX1060+CUDA 9.0+cuDNN7.3+tensorflow-gpu 1.12.0+python3.5.5)
Jun 22 Python
python用tkinter实现一个gui的翻译工具
Oct 26 Python
requests在python中发送请求的实例讲解
Feb 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
第八节 访问方式 [8]
2006/10/09 PHP
php设计模式 Singleton(单例模式)
2011/06/26 PHP
wamp下修改mysql访问密码的解决方法
2013/05/07 PHP
jQuery中的RadioButton,input,CheckBox取值赋值实现代码
2014/02/18 PHP
php+ajax注册实时验证功能
2016/07/20 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
2018/03/02 PHP
脚本吧 - 幻宇工作室用到js,超强推荐base.js
2006/12/23 Javascript
JavaScript的目的分析
2007/01/05 Javascript
点击页面其它地方隐藏该div的两种思路
2013/11/18 Javascript
jQuery ui 利用 datepicker插件实现开始日期(minDate)和结束日期(maxDate)
2014/05/22 Javascript
Javascript数据结构与算法之列表详解
2015/03/12 Javascript
js实现楼层效果的简单实例
2016/07/15 Javascript
js实现移动端微信页面禁止字体放大
2017/02/16 Javascript
使用canvas及js简单生成验证码方法
2017/04/02 Javascript
JS时间控制实现动态效果的实例讲解
2017/07/31 Javascript
JavaScript树的深度优先遍历和广度优先遍历算法示例
2018/07/30 Javascript
Bootstrap Table实现定时刷新数据的方法
2018/08/13 Javascript
React实现全选功能
2020/08/25 Javascript
关于ES6尾调用优化的使用
2020/09/11 Javascript
[01:50]2014DOTA2西雅图邀请赛 专访欢乐周宝龙
2014/07/08 DOTA
python虚拟环境virtualenv的安装与使用
2017/09/21 Python
python中reader的next用法
2018/07/24 Python
Python中对数组集进行按行打乱shuffle的方法
2018/11/08 Python
python版本五子棋的实现代码
2018/12/11 Python
python opencv角点检测连线功能的实现代码
2020/11/24 Python
Python做图像处理及视频音频文件分离和合成功能
2020/11/24 Python
一款纯css3实现的颜色渐变按钮的代码教程
2014/11/12 HTML / CSS
如何使用localstorage代替cookie实现跨域共享数据问题
2018/04/18 HTML / CSS
马来西亚最好的婴儿商店:Motherhood
2017/09/14 全球购物
加州风格的游泳和沙滩装品牌:Cupshe
2019/06/10 全球购物
五年级语文教学反思
2014/01/30 职场文书
护理专业自荐书
2014/06/04 职场文书
科技节口号
2014/06/19 职场文书
中国梦演讲稿范文
2014/08/28 职场文书
少先队辅导员事迹材料
2014/12/24 职场文书
关于python爬虫应用urllib库作用分析
2021/09/04 Python