浅谈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文件比较示例分享
Jan 10 Python
python两种遍历字典(dict)的方法比较
May 29 Python
python生成验证码图片代码分享
Jan 28 Python
Python字符串拼接的几种方法整理
Aug 02 Python
Python基于jieba库进行简单分词及词云功能实现方法
Jun 16 Python
python+influxdb+shell编写区域网络状况表
Jul 27 Python
用Python实现筛选文件脚本的方法
Oct 27 Python
如何利用Python分析出微信朋友男女统计图
Jan 25 Python
使用PyQtGraph绘制精美的股票行情K线图的示例代码
Mar 14 Python
Python后台开发Django会话控制的实现
Apr 15 Python
python安装numpy和pandas的方法步骤
May 27 Python
python 读写excel文件操作示例【附源码下载】
Jun 19 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
vBulletin Forum 2.3.xx SQL Injection
2006/10/09 PHP
php文件怎么打开 如何执行php文件
2011/12/21 PHP
客户端脚本中常常出现的一些问题和调试技巧
2007/01/09 Javascript
关于jquery ajax 调用带参数的webservice返回XML数据一个小细节
2012/07/31 Javascript
sencha touch 模仿tabpanel导航栏TabBar的实例代码
2013/10/24 Javascript
JavaScript中对象介绍
2014/12/31 Javascript
javascript中AJAX用法实例分析
2015/01/30 Javascript
js获取当前日期时间及其它操作汇总
2015/04/17 Javascript
IE8下jQuery改变png图片透明度时出现的黑边
2015/08/30 Javascript
使用jquery.qrcode.min.js实现中文转化二维码
2016/03/11 Javascript
使用伪命名空间封装保护独自创建的对象方法
2016/08/04 Javascript
js闭包用法实例详解
2016/12/13 Javascript
HTML5 js实现拖拉上传文件功能
2020/11/20 Javascript
jQuery插件FusionCharts实现的2D柱状图效果示例【附demo源码下载】
2017/03/06 Javascript
详解Vue中一种简易路由传参办法
2017/09/15 Javascript
关于angularJs清除浏览器缓存的方法
2017/11/28 Javascript
Vue表单绑定的实例代码(单选按钮,选择框(单选时,多选时,用 v-for 渲染的动态选项)
2019/05/13 Javascript
jquery ajax 请求小技巧实例分析
2019/11/11 jQuery
你可能从未使用过的11+个JavaScript特性(小结)
2020/01/08 Javascript
[03:49]DOTA2英雄基础教程 光之守卫
2014/01/14 DOTA
[01:06:07]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS CIS
2014/05/22 DOTA
[10:34]DOTA2上海特级锦标赛全纪录
2016/03/25 DOTA
python中使用enumerate函数遍历元素实例
2014/06/16 Python
Python简单实现控制电脑的方法
2018/01/22 Python
python 不同方式读取文件速度不同的实例
2018/11/09 Python
Python中的类与类型示例详解
2019/07/10 Python
详解Pycharm出现out of memory的终极解决方法
2020/03/03 Python
自定义Django Form中choicefield下拉菜单选取数据库内容实例
2020/03/13 Python
Django中ORM的基本使用教程
2020/12/22 Python
HTML5 新事件 小结
2009/07/16 HTML / CSS
C语言笔试集
2012/07/24 面试题
社区平安建设方案
2014/05/25 职场文书
民主评议党员登记表自我评价
2014/10/20 职场文书
2014年图书馆工作总结
2014/11/25 职场文书
详解MySql中InnoDB存储引擎中的各种锁
2022/02/12 MySQL
Win11跳过联网界面创建本地管理账户的3种方法
2022/04/20 数码科技