浅谈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使用MD5加密字符串示例
Aug 22 Python
简单介绍Python2.x版本中的cmp()方法的使用
May 20 Python
Python进阶_关于命名空间与作用域(详解)
May 29 Python
Python 按字典dict的键排序,并取出相应的键值放于list中的实例
Feb 12 Python
对Python3之方法的覆盖与super函数详解
Jun 26 Python
对python特殊函数 __call__()的使用详解
Jul 02 Python
PyQtGraph在pyqt中的应用及安装过程
Aug 04 Python
python实现智能语音天气预报
Dec 02 Python
Python数据可视化:幂律分布实例详解
Dec 07 Python
为什么称python为胶水语言
Jun 16 Python
Python命名空间及作用域原理实例解析
Aug 12 Python
Python基于Opencv识别两张相似图片
Apr 25 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警告Creating default object from empty value 问题的解决方法
2014/04/02 PHP
CI框架源码解读之利用Hook.php文件完成功能扩展的方法
2016/05/18 PHP
php合并数组并保留键值的实现方法
2018/03/12 PHP
jQuery源码分析-01总体架构分析
2011/11/14 Javascript
js汉字排序问题 支持中英文混排,兼容各浏览器,包括CHROME
2011/12/20 Javascript
Javascript中 关于prototype属性实现继承的原理图
2013/04/16 Javascript
JavaScript输出当前时间Unix时间戳的方法
2015/04/06 Javascript
JS实现的自定义右键菜单实例二则
2015/09/01 Javascript
javascript汉字拼音互转的简单实例
2016/10/09 Javascript
浅谈js的异步执行
2016/10/18 Javascript
JavaScript 轮播图和自定义滚动条配合鼠标滚轮分享代码贴
2016/10/28 Javascript
protractor的安装与基本使用教程
2017/07/07 Javascript
vue loadmore 组件滑动加载更多源码解析
2017/07/19 Javascript
Angular通过angular-cli来搭建web前端项目的方法
2017/07/27 Javascript
vuejs 单文件组件.vue 文件的使用
2017/07/28 Javascript
对存在JavaScript隐式类型转换的四种情况的总结(必看篇)
2017/08/31 Javascript
JavaScript判断输入是否为数字类型的方法总结
2017/09/28 Javascript
vue中实现methods一个方法调用另外一个方法
2018/02/08 Javascript
微信小程序中使用echarts的实现方法
2019/04/24 Javascript
JavaScript canvas动画实现时钟效果
2020/02/10 Javascript
Python中MYSQLdb出现乱码的解决方法
2014/10/11 Python
详解Python程序与服务器连接的WSGI接口
2015/04/29 Python
Python实现处理管道的方法
2015/06/04 Python
Python实现的下载网页源码功能示例
2017/06/13 Python
Windows下Anaconda的安装和简单使用方法
2018/01/04 Python
python2和python3实现在图片上加汉字的方法
2019/08/22 Python
五分钟学会怎么用Pygame做一个简单的贪吃蛇
2021/01/06 Python
澳大利亚波希米亚风时尚品牌:Tree of Life
2019/09/15 全球购物
销售人员自我评价怎么写
2013/09/19 职场文书
经理任命书模板
2014/06/06 职场文书
2015年消费者权益日活动总结
2015/02/09 职场文书
抢劫罪辩护词
2015/05/21 职场文书
2015年幼儿园学期工作总结
2015/05/22 职场文书
2016国庆促销广告语
2016/01/28 职场文书
CSS3实现的3D隧道效果
2021/04/27 HTML / CSS
一小时迅速入门Mybatis之bind与多数据源支持 Java API
2021/09/15 Javascript