浅谈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 可爱的大小写
Sep 06 Python
零基础写python爬虫之使用urllib2组件抓取网页内容
Nov 04 Python
python解决网站的反爬虫策略总结
Oct 26 Python
从头学Python之编写可执行的.py文件
Nov 28 Python
Python应用库大全总结
May 30 Python
Python多线程应用于自动化测试操作示例
Dec 06 Python
pandas把所有大于0的数设置为1的方法
Jan 26 Python
python动态进度条的实现代码
Jul 03 Python
解决Python logging模块无法正常输出日志的问题
Feb 21 Python
python读取配置文件方式(ini、yaml、xml)
Apr 09 Python
Selenium获取登录Cookies并添加Cookies自动登录的方法
Dec 04 Python
Python如何加载模型并查看网络
Jul 15 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中文件读、写、删的操作(PHP中对文件和目录操作)
2012/03/06 PHP
PHP错误机制知识汇总
2016/03/24 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
Laravel中GraphQL接口请求频率实战记录
2020/09/01 PHP
jquery中的mouseleave和mouseout的区别 模仿下拉框效果
2012/02/07 Javascript
Javascript设计模式之观察者模式的多个实现版本实例
2015/03/03 Javascript
JavaScript观察者模式(经典)
2015/12/09 Javascript
JavaScript 正则表达式中global模式的特性
2016/02/25 Javascript
bootstrap和jQuery.Gantt的css冲突 如何解决
2016/05/29 Javascript
jQuery实现鼠标经过像翻页和描点链接效果
2016/08/08 Javascript
微信小程序 常见问题总结(4058,40013)及解决办法
2017/01/11 Javascript
Vue input控件通过value绑定动态属性及修饰符的方法
2017/05/03 Javascript
NodeJS实现自定义流的方法
2018/08/01 NodeJs
nodejs 如何手动实现服务器
2018/08/20 NodeJs
微信小程序授权登录及解密unionId出错的方法
2018/09/26 Javascript
如何实现一个webpack模块解析器
2018/10/24 Javascript
npm 语义版本控制详解
2019/09/10 Javascript
node.js基础知识汇总
2020/08/25 Javascript
[48:12]Secret vs Optic Supermajor 胜者组 BO3 第三场 6.4
2018/06/05 DOTA
用yum安装MySQLdb模块的步骤方法
2016/12/15 Python
深入解答关于Python的11道基本面试题
2017/04/01 Python
Python模块WSGI使用详解
2018/02/02 Python
python多线程同步之文件读写控制
2021/02/25 Python
Python3+Django get/post请求实现教程详解
2021/02/16 Python
使用HTML5和CSS3制作一个模态框的示例
2018/03/07 HTML / CSS
HTML5页面无缝闪开的问题及解决方案
2020/06/11 HTML / CSS
自荐信不宜过于夸大
2013/11/06 职场文书
监理资料员岗位职责
2014/01/03 职场文书
生日宴会答谢词
2014/01/09 职场文书
大学英语演讲稿范文
2014/04/24 职场文书
优秀安全员事迹材料
2014/05/11 职场文书
幼儿老师求职信
2014/06/30 职场文书
授权委托书(完整版)
2014/09/10 职场文书
专业技术职务聘任证明
2015/03/02 职场文书
2019年员工旷工保证书!
2019/06/28 职场文书
创业计划书之物流运送
2019/09/17 职场文书