关于 Python Iterator 协议的一点思考
转:http://www.jianshu.com/p/dcf83643deeb
Python 中有好几种容器或者序列类型:list
tuple
dict
set
str
,对于这些类型中的内容,往往需要一种方式去遍历获取它们来进行操作。所以 Python 提供了迭代器的类型来对这些类型的内容进行迭代遍历,迭代类型新增于 Python 2.2。
迭代器类型指的是遵循迭代器协议的类型,对于 Python2.x 版本来说就是实现了 __iter__
和 next
函数的对象类型。如果一个对象实现了迭代器协议,则可以用 for
语句遍历这个对象的内容。其中 __iter__
函数返回一个迭代器对象,而 next
函数则需要返回容器的下一个内容,如果没有下一个则抛出 StopIteration 异常,这个异常在 for ... in
语句中将会被捕获然后结束迭代。迭代器协议详细内容可以查看 PEP234 。Python3.x 将 next
函数改成了 __next__
函数,以和其他内置的函数保持一致的双下划线风格。
以前看迭代器协议的时候,经常可以看到这样一个实现:
1 |
|
最近看到了这么一个写法:
1 |
|
这个写法没有 next
函数了,初看起来好像没有完全实现迭代器协议的样子,但是仔细考虑下的话,__iter__
函数内部调用了内置函数 iter
,实际上是返回了一个迭代器对象,而这个迭代器对象当然是实现了迭代器协议的。所以第二种写法也是完全可以的,并且对比第一种写法来说更加简单。
在官方文档 迭代器类型 中可以看到,对于 list
dict
等容器对象来说,它们的 __iter__
函数返回的不是其自身,而是一个迭代器对象: container.__iter__()
。所以当一个容器对象需要提供迭代的功能的时候,不是把这个容器对象变成一个迭代器对象,而是返回一个迭代器对象,将迭代的功能委托给这个迭代器对象。所以上面两种写法的区别在于一个是实现了迭代器对象,一个是实现了可迭代的容器对象。所以第二种写法如果稍稍微修改下:
1 |
|
这样就利用了之前定义的迭代器对象 Reverse
来给对象 IterObj
提供了反向迭代的功能。可以看到,这样的处理方式将迭代的逻辑和容器对象分离了,更加的灵活,容器对象本身也更加精简。
Python 的迭代器协议统一了 Python 中容器对象进行迭代的方式,另一方面来说,也为用户自定义类型添加迭代的功能添加了方便的实现方式,所以无论是从语言的标准化来说还是从用户使用角度的来说都是非常有用的一个协议。
关于 Python Iterator 协议的一点思考的更多相关文章
- 对扩展openflow协议的一点思考
软件定义X变得越来越火,正所谓,Software is eating the world. 软件定义网络也是如此.不论是在工业界还是学术界都将是一次伟大的革命,都在紧随着这个行业的方向,找自 ...
- Python Iterator and Generator
Python Iterator and Generator Iterator 迭代器(Iterator)和可迭代对象(Iterable)往往是绑定的.可迭代对象就是我们平时经常用的list ,st ...
- 【翻译】全球用尽IPv4的一点思考
作者:Dimple 公众号:奔跑吧攻城狮 简介:专属于Java和Android开发,和你聊聊职场话题,一同展望未来 作为小小号主的我表示很无力啊,这几天,天天都是热点.前有网易员工勇敢发声维护自己的利 ...
- 关于java异常的一点思考
关于异常的一点思考 异常生命周期 异常的来源 所有的异常都是抛出来的 有底层api抛出的 有自定义抛出的 异常的处理 1, 运行时异常 不做任何处理仍可编译通过 不建议捕获(不建议用异常来做流程控制, ...
- MSSQL显错注入爆数字型数据的一点思考
Title:MSSQL显错注入爆数字型数据的一点思考 --2011-02-22 15:23 MSSQL+ASP 最近在弄个站点,密码是纯数字的,convert(int,())转换出来不报错,也不知道其 ...
- 对dump脱壳的一点思考
对dump脱壳的一点思考 偶然翻了一下手机日历,原来今天是夏至啊,时间过的真快.ISCC的比赛已经持续了2个多月了,我也跟着比赛的那些题目学了2个月.......虽然过程很辛苦,但感觉还是很幸运的,能 ...
- 关于linux kernel slab内存管理的一点思考
linux kernel 内存管理是个很大的话题,这里记录一点个人关于slab模块的一点思考总结. 有些书把slab介绍成高速缓存,这会让人和cache,特别是cpu cache混淆,造成误解.sla ...
- 关于html页面元素语义化的一点思考
这几天在看招聘公告前端工程师的要求基本都附带了html语义化的要求,所以稍微关注了下这方面的知识.对于其中的一点就是要求页面元素在去除css样式之后还能有良好的布局引发了我一点思考.作为前端刚入门的我 ...
- c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程
c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...
随机推荐
- python escape sequences
转义字符 描述 \(在行尾时) 续行符 \\ 反斜杠符号 \' 单引号 \" 双引号 \a 响铃 \b 退格(Backspace) \e 转义 \000 空 \n 换行 \v 纵向制表符 \ ...
- JavaScript理解
Javascript,是从类型(type)开始,这些类型在JS中分为两大类:原生类型与对象类型.原生类型包括:number,string, boolean, null, undefined:剩下的非原 ...
- tnsnames linux找的位置顺序
In Sue’s article, it states that SQLDeveloper looks for a tnsnames.ora in the following places in th ...
- maven设置---Dmaven.multiModuleProjectDirectory system propery is not set.
设置maven 环境变量: MAVEN_HOME:D:\Java\apache-maven-3.3.3 M2_HOME:D:\Java\apache-maven-3.3.3 path:%MAVEN_H ...
- [web] 200 OK (from cache) 与 304 Not Modified
为什么有的缓存是 200 OK (from cache),有的缓存是 304 Not Modified 呢?很简单,看运维是否移除了 Entity Tag.移除了,就总是 200 OK (from c ...
- 响应式布局设置--@media only screen and
@media only screen and only(限定某种设备) screen 是媒体类型里的一种 and 被称为关键字,其他关键字还包括 not(排除某种设备) /* 常用类型 */类型 解 ...
- Angular学习(5)- 数组双向梆定+filter
示例: <!DOCTYPE html> <html ng-app="MyApp"> <head> <title>Study 5< ...
- LintCode "Coins in a Line III" !!
https://codesolutiony.wordpress.com/2015/05/24/lintcode-coins-in-a-line-iii/ A very juicy one! Deser ...
- (转)[SQL Server] 动态sql给变量赋值(或返回值给变量)
本文转载自:http://blog.csdn.net/xiaoxu0123/article/details/5684680 [SQL Server] 动态sql给变量赋值(或返回值给变量) decla ...
- android学习笔记19——对话框(DatePickerDialog、TimePickerDialog)
DatePickerDialog.TimePickerDialog ==> DatePickerDialog.TimePickerDialog功能.用法都比较简单,操作步骤: 1.通过new关键 ...