浅谈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 相关文章推荐
python3使用requests模块爬取页面内容的实战演练
Sep 25 Python
Python实现螺旋矩阵的填充算法示例
Dec 28 Python
解决Spyder中图片显示太小的问题
Apr 27 Python
python 平衡二叉树实现代码示例
Jul 07 Python
python基于paramiko将文件上传到服务器代码实现
Jul 08 Python
django框架CSRF防护原理与用法分析
Jul 22 Python
python 命令行传入参数实现解析
Aug 30 Python
Python values()与itervalues()的用法详解
Nov 27 Python
Python3 filecmp模块测试比较文件原理解析
Mar 23 Python
使用Pycharm分段执行代码
Apr 15 Python
浅谈keras中的目标函数和优化函数MSE用法
Jun 10 Python
Python函数调用追踪实现代码
Nov 27 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
Session保存到数据库的php类分享
2011/10/24 PHP
PHP代码优化的53个细节
2014/03/03 PHP
swoole和websocket简单聊天室开发
2017/11/18 PHP
PHP实现git部署的方法教程
2017/12/19 PHP
怎么用javascript进行拖拽
2006/07/20 Javascript
javascript脚本调试方法小结
2008/11/24 Javascript
编写Js代码要注意的几条规则
2010/09/10 Javascript
中国地区三级联动下拉菜单效果分析
2012/11/15 Javascript
实用的JS正则表达式(手机号码/IP正则/邮编正则/电话等)
2013/01/11 Javascript
jQuery ajax serialize()方法的使用以及常见问题解决
2013/01/27 Javascript
jquery 卷帘效果实现代码(不同方向)
2013/02/05 Javascript
javascript屏蔽右键代码
2014/05/15 Javascript
JavaScript中消除闭包的一般方法介绍
2015/03/16 Javascript
swtich/if...else的替代语句
2015/08/16 Javascript
AngularJS折叠菜单实现方法示例
2017/05/18 Javascript
深入理解Nodejs Global 模块
2017/06/03 NodeJs
浅谈mint-ui 填坑之路
2017/11/06 Javascript
jQuery NProgress.js加载进度插件的简单使用方法
2018/01/31 jQuery
Javascript读取上传文件内容/类型/字节数
2019/04/30 Javascript
axios如何取消重复无用的请求详解
2019/12/15 Javascript
python数据类型判断type与isinstance的区别实例解析
2017/10/31 Python
Python制作词云的方法
2018/01/03 Python
Python读写文件基础知识点
2019/06/10 Python
python django model联合主键的例子
2019/08/06 Python
原来我一直安装 Python 库的姿势都不对呀
2019/11/11 Python
利用pandas将非数值数据转换成数值的方式
2019/12/18 Python
解决Tensorboard可视化错误:不显示数据 No scalar data was found
2020/02/15 Python
Python3 shelve对象持久存储原理详解
2020/03/23 Python
改变 Python 中线程执行顺序的方法
2020/09/24 Python
AmazeUI 按钮交互的实现示例
2020/08/24 HTML / CSS
Bonprix法国:时尚、鞋子、家居
2020/12/29 全球购物
编程用JAVA解析XML的方式
2013/07/07 面试题
《浅水洼里的小鱼》听课反思
2014/02/28 职场文书
放飞理想演讲稿
2014/09/09 职场文书
暑期社会实践证明书
2014/11/17 职场文书
2015年世界水日活动总结
2015/02/09 职场文书