[python 笔记] __iter__迭代器
可迭代对象和迭代器
https://blog.csdn.net/nightcharm/article/details/78964676
可迭代对象
对象里面含有__iter__()方法的实现,对象的__iter__()函数经调用后会返回一个迭代器,这个迭代器含有具体数据获取的实现。
迭代器
包含__next__()方法的实现,在正确范围内返回下一个可用元素;超出范围后抛出StopIteration,通知调用者迭代结束。
迭代器工作的基本步骤
https://blog.csdn.net/bluebird_237/article/details/38894617
1. 可迭代对象调用 __iter__()方法返回迭代器(self)
2. 迭代器调用__next()__ 函数,返回下一个可用元素;如果没有元素了,抛出StopIteration
for... in...的实现原理
如果一个类想被用于for ... in循环,类似list或tuple那样,就必须实现一个__iter__()方法,该方法返回一个迭代对象,然后,Python的for循环就会不断调用该迭代对象的next()方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环。
我们以斐波那契数列为例,写一个Fib类,可以作用于for循环
class Fib(object):
def __init__(self):
self.a, self.b = 0, 1 def __iter__(self):
return self def __next__(self):
self.a, self.b = self.b, self.a + self.b
if self.a > 1000:
raise StopIteration();
return self.a for n in Fib():
print(n) #
#
#
#
#
#
#
#
#
#
#
#
#
#
#
注意:在python 3中应使用__next__(), 而非 next(), 否则会报错:TypeError: iter() returned non-iterator of type 'Fib'。
实现的大致流程:
for i in seq:
do_sth_to(i) ################ fetch = iter(seq) #return an iterator
while True:
try:
i = fetch.next() # iterator call __next__()
except StopIteration:
break # iteration finished
do_sth_to(i)
迭代器的工作原理
迭代器相当于一个有__next__()方法的对象,当(一个循环机制)需要下一项时,调用迭代器的__next__()方法即可获得。条目全部被取出后,会引发一个StopIteration异常,通知外部调用者,迭代完成。
迭代器的限制
1. 不能向后移动回到开始
2. 不能复制一个迭代器
3. 若要再次(或同时)迭代同个对象,只能去创建另一个迭代器对象
4. 迭代时请尽量不要修改该对象,否则可能会出错
其他工具:
1. reversed()内建函数将返回一个反序访问的迭代器
2. enumerate()内建函数返回迭代器
3. any(), all()
4. python提供itertools 模块, 它包含各种有用的迭代器
对比生成器
迭代器是一个对象,生成器是一个函数。
迭代器和生成器是python中两个非常强大的特性,编写程序时你可以不使用生成器达到同样的效果,但是生成器让你的程序更加pythonic。
创建生成器非常简单,只要在函数中加入yield语句即可。函数中每次使用yield产生一个值,函数就返回该值,然后停止执行,等待被激活,被激活后继续在原来的位置执行。
def fib():
a, b = 0, 1
while 1:
a, b = b, a + b
yield a for f in fib():
if f < 1000:
print(f)
else:
break
[python 笔记] __iter__迭代器的更多相关文章
- s21day22 python笔记
s21day22 python笔记 一.内容回顾及补充 模块补充 importlib.import_module:通过字符串的形式导入模块 #示例一: import importlib # 用字符串的 ...
- python笔记 - day8
python笔记 - day8 参考: http://www.cnblogs.com/wupeiqi/p/4766801.html http://www.cnblogs.com/wupeiqi/art ...
- python笔记 - day5
python笔记 - day5 参考: http://www.cnblogs.com/wupeiqi/articles/5484747.html http://www.cnblogs.com/alex ...
- python笔记之中缀语法和管道实现
python笔记之中缀语法和管道实现 你知道什么是中缀语法吗?你知道python中的中缀操作是什么吗?那你知道操作python也是可以像unix的管道符一样方便吗?那么,废话不说了,直接上代码. cl ...
- python笔记之itertools模块
python笔记之itertools模块 itertools模块包含创建有效迭代器的函数,可以用各种方式对数据进行循环操作,此模块中的所有函数返回的迭代器都可以与for循环语句以及其他包含迭代器(如生 ...
- Python基础之迭代器和生成器
阅读目录 楔子 python中的for循环 可迭代协议 迭代器协议 为什么要有for循环 初识生成器 生成器函数 列表推导式和生成器表达式 本章小结 生成器相关的面试题 返回顶部 楔子 假如我现在有一 ...
- python学习日记(迭代器、生成器)-乱七八糟
迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退 ...
- python基础之迭代器协议和生成器
迭代器和生成器补充:http://www.cnblogs.com/luchuangao/p/6847081.html 一 递归和迭代 略 二 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个ne ...
- Python:笔记(6)——正则表达式
Python:笔记(6)——正则表达式 re模块 re模块用于在字符串中执行基于正则表达式模式的匹配和替换. 使用原始字符串 正则表达式使用 \ 对特殊字符进行转义,比如,为了匹配字符串 ‘pytho ...
随机推荐
- Laravel-admin form 表单是增加或者修改
Laravel-admin 实现 form 表单是增加或者修改的三种方法,应用情景:1.新增或者修改 form 展示的表单不同:2.新增或者保存前后回调进行其他的操作 1. use Illuminat ...
- java-阿里云发送短信
<!--aliyun短信sdk--> <dependency> <groupId>com.aliyun</groupId> <artifactId ...
- 面试题1-十进制数转化为十六进制数,不使用hex方法
问题: 给定一个整数,写一个算法将它转换为16进制,对于负数,可以使用two’s complement方法 def tohex(num): """十进制数转十六进制数&q ...
- c# 简单打开关闭摄像头
const short WM_CAP = 1024; const int WM_CAP_DRIVER_CONNECT = WM_CAP + 10; const int WM_CAP_DRIVER_DI ...
- PostMan测试Web Service
1.设置URL 2.设置请求模式:Post 3.设置Header:添加 Content-Type ,值为 text/xml;charset=utf-8 4.设置Body:勾选raw 5.输入Body内 ...
- JS中的事件传播流程
JS中的事件传播流程 1,Javascript与HTML之间的交互是通过事件实现的. 事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间. 可以使用侦听器来预定事件,以便事件发生时执行相应代码. 2 ...
- 第十四篇 JS实现加减乘除 正则表达式
JS实现加减乘除 这节课,将会继续使用到if判断,会让同学们再看到一个新的,else if判断语句,意思是:否则如果,是基于if下的判断语句,就是说,if不成立则再来判断else if,可以这样,假如 ...
- python中同步、多线程、异步IO、多线程对IO密集型的影响
目录 1.常见并发类型 2.同步版本 3.多线程 4.异步IO 5.多进程 6.总结 1.常见并发类型 I/ O密集型: 蓝色框表示程序执行工作的时间,红色框表示等待I/O操作完成的时间.此图没有按比 ...
- MySQL select之后再update
1.先查询页面 而后再根据查询的结果来更改数据库,可以使用SELECT …… FOR UPDATE 来实现,具体的代码如下 SELECT * FROM chat //查询的表 //查询的条件 FOR ...
- 记录一次k8s环境尝试过程(初始方案,现在已经做过很多完善,例如普罗米修斯)
记录一次Team k8s环境搭建过程(初始方案,现在已经做过很多完善,例如普罗米修斯) span::selection, .CodeMirror-line > span > span::s ...