一篇文章弄懂Python中的可迭代对象、迭代器和生成器


Posted in Python onAugust 12, 2019

我们都知道,序列可以迭代。但是,你知道为什么吗? 本文来探讨一下迭代背后的原理。

序列可以迭代的原因:iter 函数。解释器需要迭代对象 x 时,会自动调用 iter(x)。内置的 iter 函数有以下作用:

(1) 检查对象是否实现了 iter 方法,如果实现了就调用它,获取一个迭代器。

(2) 如果没有实现 iter 方法,但是实现了 getitem 方法,而且其参数是从零开始的索引,Python 会创建一个迭代器,尝试按顺序(从索引 0 开始)获取元素。

(3) 如果前面两步都失败,Python 抛出 TypeError 异常,通常会提示“C objectis not iterable”(C 对象不可迭代),其中 C 是目标对象所属的类。

由此我们可以明确知道什么是 可迭代的对象: 使用 iter 内置函数可以获取迭代器的对象。即要么对象实现了能返回迭代器的 iter 方法,要么对象实现了 getitem 方法,而且其参数是从零开始的索引。

下面看一个实现了getitem方法的例子:

一篇文章弄懂Python中的可迭代对象、迭代器和生成器

输出结果:

一篇文章弄懂Python中的可迭代对象、迭代器和生成器

我们创建了一个类Eg1,并且为这个类实现了 getitem 方法, 它的实例化对象o1 就是可迭代对象。

下面我们看一个实现 iter 方法的例子,因为用到了迭代器,所以在此我们必须在明确一下迭代器的用法。 标准的迭代器接口有两个方法:

一篇文章弄懂Python中的可迭代对象、迭代器和生成器

返回下一个可用的元素,如果没有元素了,抛出 StopIteration异常。

一篇文章弄懂Python中的可迭代对象、迭代器和生成器

返回 self,以便在应该使用可迭代对象的地方使用迭代器,例如在 for 循环中。

一篇文章弄懂Python中的可迭代对象、迭代器和生成器

我们创建了Eg2类,并为它实现了 iter 方法,此方法返回一个迭代器Eg2Iterator。 Eg2Iterator 实现了我们之前所说的next和iter方法。 实例化对象,并循环输出:

一篇文章弄懂Python中的可迭代对象、迭代器和生成器

可见,和o1是一样的。

我们通过两种方法实现了一个自己的可迭代对象,再此过程中我们要明确可迭代的对象和迭代器之间的关系:

Python 从可迭代的对象中获取迭代器。

iter方法从我们自己创建的迭代器类中获取迭代器,而getitem方法是python内部自动创建迭代器。

至此,我们明白了如何正确地实现可迭代对象,并且引出了怎样实现迭代器,但是使用迭代器方法(即上面的例子2)的代码量有点大,下面我们来了解一下如何使用更符合 Python 习惯的方式实现 Eg2类。

一篇文章弄懂Python中的可迭代对象、迭代器和生成器

哦了!就这么简单优雅!不用再单独定义一个迭代器类!

这里我们使用了yield 关键字, 只要 Python 函数的定义体中有 yield 关键字,该函数就是生成器函数。调用生成器函数时,会返回一个生成器对象。也就是说,生成器函数是生成器工厂。 当然,例子3的代码还可以使用yield from进一步简化:

一篇文章弄懂Python中的可迭代对象、迭代器和生成器

到这里我们明白了 可迭代对象 和 迭代器,还引申出了生成器,但还有一点没有提,那就是生成器表达式。

使用生成器表达式例子4的代码可以修改为:

一篇文章弄懂Python中的可迭代对象、迭代器和生成器

在python中,所有生成器都是迭代器。

最后,总结一下:

(1)什么是可迭代对象? 可迭代对象要么实现了能返回迭代器的 iter 方法,要么实现了 getitem 方法而且其参数是从零开始的索引。

(2)什么是迭代器? 迭代器是这样的对象:实现了无参数的 next 方法,返回下一个元素,如果没有元素了,那么抛出 StopIteration 异常;并且实现iter 方法,返回迭代器本身。

(3)什么是生成器? 生成器是带有 yield 关键字的函数。调用生成器函数时,会返回一个生成器对象。

(4)什么是生成器表达式? 生成器表达式是创建生成器的简洁句法,这样无需先定义函数再调用。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python备份Mysql脚本
Aug 11 Python
在ironpython中利用装饰器执行SQL操作的例子
May 02 Python
Python判断直线和矩形是否相交的方法
Jul 14 Python
python学习笔记之调用eval函数出现invalid syntax错误问题
Oct 18 Python
解析Mac OS下部署Pyhton的Django框架项目的过程
May 03 Python
mac下给python3安装requests库和scrapy库的实例
Jun 13 Python
Tensorflow中的placeholder和feed_dict的使用
Jul 09 Python
python+influxdb+shell编写区域网络状况表
Jul 27 Python
python解压TAR文件至指定文件夹的实例
Jun 10 Python
python3 线性回归验证方法
Jul 09 Python
导入tensorflow:ImportError: libcublas.so.9.0 报错
Jan 06 Python
Pycharm同步远程服务器调试的方法步骤
Nov 04 Python
Django认证系统实现的web页面实现代码
Aug 12 #Python
django 自定义过滤器(filter)处理较为复杂的变量方法
Aug 12 #Python
django-filter和普通查询的例子
Aug 12 #Python
利用python实现汉字转拼音的2种方法
Aug 12 #Python
python面向对象 反射原理解析
Aug 12 #Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
Aug 12 #Python
Django 查询数据库并返回页面的例子
Aug 12 #Python
You might like
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
2006/10/09 PHP
php+mysql实现无限级分类 | 树型显示分类关系
2006/11/19 PHP
php进行支付宝开发中return_url和notify_url的区别分析
2014/12/22 PHP
laravel5创建service provider和facade的方法详解
2016/07/26 PHP
php获取当前月与上个月月初及月末时间戳的方法
2016/12/05 PHP
Jquery插件写法笔记整理
2012/09/06 Javascript
jQuery固定浮动侧边栏实现思路及代码
2014/09/28 Javascript
jquery任意位置浮动固定层插件用法实例
2015/05/29 Javascript
使用CSS+JavaScript或纯js实现半透明遮罩效果的实例分享
2016/05/09 Javascript
Jquery实现跨域异步上传文件总结
2017/02/03 Javascript
详解微信小程序 通过控制CSS实现view隐藏与显示
2017/05/24 Javascript
Node.js创建Web、TCP服务器
2017/12/05 Javascript
微信小程序methods中定义的方法互相调用的实例代码
2018/08/07 Javascript
实例分析vue循环列表动态数据的处理方法
2018/09/28 Javascript
Vue监听页面刷新和关闭功能
2019/06/20 Javascript
js实现详情页放大镜效果
2020/10/28 Javascript
Python3基础之条件与循环控制实例解析
2014/08/13 Python
Python列表(list)、字典(dict)、字符串(string)基本操作小结
2014/11/28 Python
Windows上配置Emacs来开发Python及用Python扩展Emacs
2015/11/20 Python
Python3利用SMTP协议发送E-mail电子邮件的方法
2017/09/30 Python
python爬虫之BeautifulSoup 使用select方法详解
2017/10/23 Python
python+django加载静态网页模板解析
2017/12/12 Python
python爬取足球直播吧五大联赛积分榜
2018/06/13 Python
基于PyTorch的permute和reshape/view的区别介绍
2020/06/18 Python
为什么python比较流行
2020/06/19 Python
Python脚本实现Zabbix多行日志监控过程解析
2020/08/26 Python
CSS3实现任意图片lowpoly动画效果实例
2017/05/11 HTML / CSS
html5表单及新增的改良元素详解
2016/06/07 HTML / CSS
Kusmi茶美国官网:优质散叶茶和茶包
2019/10/13 全球购物
数学系毕业生求职信
2014/05/29 职场文书
商铺消防安全责任书
2014/07/29 职场文书
学生违反校规检讨书
2014/10/28 职场文书
2014全年工作总结
2014/11/27 职场文书
搞笑婚礼主持词开场白
2015/11/24 职场文书
学习新党章心得体会2016
2016/01/15 职场文书
分布式架构Redis中有哪些数据结构及底层实现原理
2022/03/13 Redis