python __iter__ 迭代器
1. 迭代器是什么?
迭代器是一个对象,是python非常强大的特性
根本上说, 迭代器就是有一个 next() 方法的对象, 而不是通过索引来计数. 当你或是一个循环机制(例如 for 语句)需要下一个项时, 调用迭代器的 next() 方法就可以获得它. 条目全部取出后, 会引发一个 StopIteration 异常, 这并不表示错误发生, 只是告诉外部调用者, 迭代完成.
2.迭代器有什么用?
迭代器就是重复地做一些事情,可以简单的理解为循环,在python中实现了__iter__方法的对象是可迭代的,实现了next()方法的对象是迭代器,这样说起来有点拗口,实际上要想让一个迭代器工作,至少要实现__iter__方法和next方法。很多时候使用迭代器完成的工作使用列表也可以完成,但是如果有很多值列表就会占用太多的内存,而且使用迭代器也让我们的程序更加通用、优雅、pythonic。
3.迭代器该怎么用?
如果一个类想被用于for ... in
循环,类似list或tuple那样,就必须实现一个__iter__()
方法,该方法返回一个迭代对象,然后,Python的for循环就会不断调用该迭代对象的next()
方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环。
4.例子
斐波那契数列
不用__iter__的时候
用__iter__的时候
5.迭代器有什么不好的地方
不过, 迭代器也有一些限制. 例如你不能向后移动, 不能回到开始, 也不能复制一个迭代器.如果你要再次(或者是同时)迭代同个对象, 你只能去创建另一个迭代器对象. 不过, 这并不糟糕,因为还有其他的工具来帮助你使用迭代器.
6.迭代器工作原理
7.扩展
1)reversed() 内建函数将返回一个反序访问的迭代器. enumerate() 内建函数同样也返回迭代器.另外两个新的内建函数, any() 和 all() , 在 Python 2.5 中新增, 如果迭代器中某个/所有条目的值都为布尔真时,则它们返回值为真. 本章先前部分我们展示了如何在 for 循环中通过索引或是可迭代对象来遍历条目. 同时 Python 还提供了一整个 itertools 模块, 它包含各种有用的迭代器.
2)Python 还引进了三个新的内建字典方法来定义迭代: myDict.iterkeys() (通过 keys 迭
代), myDict.itervalues() (通过 values 迭代), 以及 myDicit.iteritems() (通过 key/value 对来迭代). 注意, in 操作符也可以用于检查字典的 key 是否存在 , 之前的布尔表达式myDict.has_key(anyKey) 可以被简写为 anyKey in myDict .
3)文件对象生成的迭代器会自动调用 readline() 方法. 这样, 循环就可以访问文本文件的所有行.
参考
https://www.cnblogs.com/xywq/p/7813915.html
最新文章
- [转]oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务。
- js执行顺序<;转>;
- JavaScript-求时间差
- mysql优化(三)–explain分析sql语句执行效率
- 截取usb数据包,控制usb设备----Relay设备
- c# SQL CLR 之一
- Unity手游之路&;lt;七&;gt;角色控制器
- uva 688 - Mobile Phone Coverage
- 使用xdebug+eclipse远程调试centOS7上的PHP代码
- Bootstrap入门(二十六)JS插件3:滚动监听
- 财务模块多组织,GL, SLA, SOB, COA, BSV, CCID, LE 概念的简单介绍
- 解决window.showModalDialog在Firefox无法支持
- Django 模本(Template--for--csrf--if--filter--simple_tag模版继承等)
- angular ng-click防止重复提交
- 自动化运维(1)之二进制部署MySQL5.7
- Yarn import now uses package-lock.json
- C#之Lambda不得不说的用法
- python之pandas&;&;DataFrame(二)
- 检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败解决方案
- 【Spark SQL 源码分析系列文章】
热门文章
- CentOS7安装CDH 第十四章:CDH的优化
- ubuntu16搭建LAMP环境
- 重新编程Hexiwear Docking Station扩展坞
- Codeforces #364 (Div. 2) D. As Fa(数学公式推导 或者二分)
- webpack 配置react脚手架(四):路由配置
- /tmp/supervisor.sock no such file 报错
- Git----拉取远程分支,git pull,git rebase,git pull --rebase的区别
- Java8新特性--函数式编程
- vue 组件高级用法(递归组件,内联模板,动态组件,异步组件)
- springboot使用rabbitmq-Topic模式,亲自实测能用!!!