浅谈Python中的生成器和迭代器


Posted in Python onJune 19, 2020

迭代器

迭代器协议

对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么返回一个异常来终止本次迭代。(只能往前走,不能往后退!)

迭代器对象

遵循了(实现了)迭代器协议的对象。(对象内部实现了一个__next__方法,以实现迭代器协议)称为一个迭代器对象。他们的作用是逐个遍历容器中的对象。迭代器对象一定是可迭代对象

>>> from collections import Iterable, Iterator

>>> l = list([1,2,3])  # 定义列表
>>> l_iter = l.__iter__()  # 调用列表的 __iter__ 方法
>>> isinstance(l, Iterable)  # 列表可迭代对象
True
>>> isinstance(l, Iterator)  # 列表不是迭代器
False

>>> isinstance(l_iter, Iterable)  # 列表的__iter__ 方法返回 是可迭代对象
True
>>> isinstance(l_iter, Iterator)  # 列表的__iter__ 方法返回 也是是迭代器对象
True

可迭代对象(iterable)

可迭代对象有很多种形式,只要满足可以每次取到容器对象中下一个对象的,都称为可迭代对象。

实现了 __iter__方法的对象称为可迭代对象。

range() 对象也是可迭代对象。

生成器对象也是可迭代对象。

>>> from collections import Iterable, Iterator

>>> isinstance(range(10), Iterator)
False
>>> isinstance(range(10), Iterable)
True

# 生成器对象一定是迭代器对象, 那么他也必然是可迭代对象
>>> isinstance((i for i in range(10)), Iterator)
True
>>> isinstance((i for i in range(10)), Iterable)
True

总结补充

列表、元组、集合、字符串、字典都是可迭代对象。

for 循环的本质:使用迭代器协议访问可迭代对象中的每一个对象。

生成器

生成器类似于一种数据类型,这种数据类型自动实现了迭代器协议,所以生成器也是迭代器。

生成器分类及在python中的表现形式:(Python有两种不同的方式提供生成器)

生成器函数

常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行

>>> def generator(n):
...   for i in range(n):
...     yield i
... 
>>> gener_obj = generator(10)
>>> gener_obj.__next__()
0
>>> gener_obj.__next__()
1
>>> gener_obj.__next__()
2
>>> type(gener_obj)
<class 'generator'>

生成器表达式

类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表,按需取出对象

注意生成器 用()包裹起来

>>> generator = (i for i in range(10))
>>> generator.__next__()
0
>>> generator.__next__()
1
>>> type(generator)
<class 'generator'>

以上就是浅谈Python中的生成器和迭代器的详细内容,更多关于Python 生成器和迭代器的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python从MP3文件获取id3的方法
Jun 15 Python
浅谈python抛出异常、自定义异常, 传递异常
Jun 20 Python
python实现FTP服务器服务的方法
Apr 11 Python
Python数据结构与算法之使用队列解决小猫钓鱼问题
Dec 14 Python
python merge、concat合并数据集的实例讲解
Apr 12 Python
Python Logging 日志记录入门学习
Jun 02 Python
Python实现矩阵相乘的三种方法小结
Jul 26 Python
python打包生成的exe文件运行时提示缺少模块的解决方法
Oct 31 Python
Pycharm 设置默认头的图文教程
Jan 17 Python
解决pycharm最左侧Tool Buttons显示不全的问题
Dec 17 Python
flask开启多线程的具体方法
Aug 02 Python
python爬取代理IP并进行有效的IP测试实现
Oct 09 Python
python中有帮助函数吗
Jun 19 #Python
python中导入 train_test_split提示错误的解决
Jun 19 #Python
python中get和post有什么区别
Jun 19 #Python
python中setuptools的作用是什么
Jun 19 #Python
python怎么判断模块安装完成
Jun 19 #Python
Keras SGD 随机梯度下降优化器参数设置方式
Jun 19 #Python
python支持多继承吗
Jun 19 #Python
You might like
PHP重定向的3种方式
2013/03/07 PHP
浅析ThinkPHP中execute和query方法的区别
2014/06/13 PHP
PHP使用GIFEncoder类生成gif动态滚动字幕
2014/07/01 PHP
PHP实现简单的新闻发布系统实例
2015/07/28 PHP
PHP抓取及分析网页的方法详解
2016/04/26 PHP
Laravel框架控制器的middleware中间件用法分析
2019/09/30 PHP
基于Jquery的$.cookie()实现跨越页面tabs导航实现代码
2011/03/03 Javascript
jQuery源码分析-05异步队列 Deferred 使用介绍
2011/11/14 Javascript
Java 正则表达式学习总结和一些小例子
2012/09/13 Javascript
jquery ajax 局部刷新小案例
2014/02/08 Javascript
jquery实现网页定位导航
2016/08/23 Javascript
总结Javascript中的隐式类型转换
2016/08/24 Javascript
JS实现控制图片显示大小的方法【图片等比例缩放功能】
2017/02/18 Javascript
jQuery实现ajax无刷新分页页码控件
2017/02/28 Javascript
jQuery简易时光轴实现方法示例
2017/03/13 Javascript
深入理解Vue-cli搭建项目后的目录结构探秘
2017/07/13 Javascript
nodejs实现OAuth2.0授权服务认证
2017/12/27 NodeJs
详解基于Vue-cli搭建的项目如何和后台交互
2018/06/29 Javascript
jquery实现动态添加附件功能
2018/10/23 jQuery
echarts实现获取datazoom的起始值(包括x轴和y轴)
2020/07/20 Javascript
python爬取51job中hr的邮箱
2016/05/14 Python
Python实现自定义顺序、排列写入数据到Excel的方法
2018/04/23 Python
Python Process创建进程的2种方法详解
2021/01/25 Python
Python使用cn2an实现中文数字与阿拉伯数字的相互转换
2021/03/02 Python
servlet面试题
2012/08/20 面试题
Java软件工程师综合面试题笔试题
2013/09/08 面试题
机械绘图员岗位职责
2013/11/19 职场文书
火箭队口号
2014/06/18 职场文书
售后客服个人自我评价
2014/09/14 职场文书
贫困证明模板(3篇)
2014/09/16 职场文书
群众路线查摆问题整改措施思想汇报
2014/10/10 职场文书
出纳年终工作总结2014
2014/12/05 职场文书
求职自荐信怎么写
2015/03/04 职场文书
《我和小伙伴》教学反思
2016/02/20 职场文书
导游词之山东八大关
2019/12/18 职场文书
Golang gRPC HTTP协议转换示例
2022/06/16 Golang