浅谈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 相关文章推荐
ssh批量登录并执行命令的python实现代码
May 25 Python
Python基于高斯消元法计算线性方程组示例
Jan 17 Python
单链表反转python实现代码示例
Feb 08 Python
python提取图像的名字*.jpg到txt文本的方法
May 10 Python
详解python3中的真值测试
Aug 13 Python
对pytorch网络层结构的数组化详解
Dec 08 Python
Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】
Mar 30 Python
Python实现个人微信号自动监控告警的示例
Jul 03 Python
Python列表解析操作实例总结
Feb 26 Python
浅谈Python 参数与变量
Jun 20 Python
Python如何爬取b站热门视频并导入Excel
Aug 10 Python
python自动化发送邮件实例讲解
Jan 04 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和ACCESS写聊天室(四)
2006/10/09 PHP
激活 ActiveX 控件
2006/10/09 Javascript
学习面向对象之面向对象的术语
2010/11/30 Javascript
js中关于new Object时传参的一些细节分析
2011/03/13 Javascript
js的Prototype属性解释及常用方法
2014/05/08 Javascript
Express.JS使用详解
2014/07/17 Javascript
详解JavaScript基于面向对象之创建对象(2)
2015/12/10 Javascript
基于javascript实现根据身份证号码识别性别和年龄
2016/01/22 Javascript
Node.js中Request模块处理HTTP协议请求的基本使用教程
2016/03/31 Javascript
JQuery DIV 动态隐藏和显示的方法
2016/06/23 Javascript
JS使用onerror捕获异常示例
2016/08/03 Javascript
详解jQuery的Cookie插件
2016/11/23 Javascript
Bootstrap Scrollspy源码学习
2017/03/02 Javascript
分享一个精简的vue.js 图片lazyload插件实例
2017/03/13 Javascript
浅谈es6 javascript的map数据结构
2017/12/14 Javascript
Vue 路由间跳转和新开窗口的方式(query、params)
2019/12/25 Javascript
JS如何生成随机验证码
2020/03/02 Javascript
vue实现桌面向网页拖动文件的示例代码(可显示图片/音频/视频)
2021/03/01 Vue.js
实例讲解Python中global语句下全局变量的值的修改
2016/06/16 Python
python 排序算法总结及实例详解
2016/09/28 Python
Python中pillow知识点学习
2018/04/30 Python
Python Web编程之WSGI协议简介
2018/07/18 Python
python使用response.read()接收json数据的实例
2018/12/19 Python
eclipse创建python项目步骤详解
2019/05/10 Python
python 消除 futureWarning问题的解决
2019/12/25 Python
Python2与Python3的区别详解
2020/02/09 Python
Python使用Excel将数据写入多个sheet
2020/05/16 Python
万户网络JAVA程序员岗位招聘笔试试卷
2013/01/08 面试题
思想政治教育专业个人求职信范文
2013/12/20 职场文书
大四学生思想汇报
2014/01/13 职场文书
辅导员评语
2014/05/04 职场文书
2014年毕业演讲稿范文
2014/05/13 职场文书
党员个人剖析材料(四风问题)
2014/10/07 职场文书
励志语录:你若不勇敢,谁替你坚强
2019/11/08 职场文书
关于Vue中的options选项
2022/03/22 Vue.js
Python first-order-model实现让照片动起来
2022/06/25 Python