解析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中使用smtplib和email模块发送邮件实例
Apr 22 Python
Python中的异常处理简明介绍
Apr 13 Python
用Python编写简单的微博爬虫
Mar 04 Python
Python 爬虫多线程详解及实例代码
Oct 08 Python
CentOS7安装Python3的教程详解
Apr 10 Python
使用Python在Windows下获取USB PID&amp;VID的方法
Jul 02 Python
Django缓存系统实现过程解析
Aug 02 Python
Python Django 封装分页成通用的模块详解
Aug 21 Python
通过Python实现一个简单的html页面
May 16 Python
在Pycharm中安装Pandas库方法(简单易懂)
Feb 20 Python
Django 如何实现文件上传下载
Apr 08 Python
使用Python获取字典键对应值的方法
Apr 26 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 创建标签云函数代码
2010/05/26 PHP
PHP生成数组再传给js的方法
2014/08/07 PHP
PHP 错误处理机制
2015/07/06 PHP
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
php实现的mongoDB单例模式操作类
2018/01/20 PHP
jQuery 表单验证扩展代码(二)
2010/10/20 Javascript
jQuery下通过$.browser来判断浏览器.
2011/04/05 Javascript
javascript内存管理详细解析
2013/11/11 Javascript
Javascript堆排序算法详解
2014/12/03 Javascript
JQuery中两个ul标签的li互相移动实现方法
2015/05/18 Javascript
JavaScript正则表达式和级联效果
2017/09/14 Javascript
Vue2.0实现组件数据的双向绑定问题
2018/03/06 Javascript
微信小程序实现banner图轮播效果
2020/06/28 Javascript
vue两组件间值传递 $router.push实现方法
2019/05/15 Javascript
npm的lock机制解析
2019/06/20 Javascript
JavaScript键盘事件响应顺序详解
2019/09/30 Javascript
Vue 2.0双向绑定原理的实现方法
2019/10/23 Javascript
解决谷歌搜索技术文章时打不开网页问题的python脚本
2013/02/10 Python
Python基于DES算法加密解密实例
2015/06/03 Python
详解python中的文件与目录操作
2017/07/11 Python
python使用opencv驱动摄像头的方法
2018/08/03 Python
python中使用zip函数出现错误的原因
2018/09/28 Python
详解django2中关于时间处理策略
2019/03/06 Python
python实现移位加密和解密
2019/03/22 Python
10 行Python 代码实现 AI 目标检测技术【推荐】
2019/06/14 Python
PyCharm 配置远程python解释器和在本地修改服务器代码
2019/07/23 Python
pandas中ix的使用详细讲解
2020/03/09 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
2020/05/15 Python
Django数据统计功能count()的使用
2020/11/30 Python
如何利用python正则表达式匹配版本信息
2020/12/09 Python
Python .py生成.pyd文件并打包.exe 的注意事项说明
2021/03/04 Python
广州地球村科技数据库题目
2016/04/25 面试题
优秀党员主要事迹
2014/01/19 职场文书
电焊工岗位职责
2014/03/06 职场文书
四风问题专项整治工作情况报告
2014/10/28 职场文书
单位委托函范文
2015/01/29 职场文书