Python 中iterator
The two methods correspond to two distinct protocols:
1. An object can be iterated over with "for" if it implements__iter__() or __getitem__().如果你想让他能够按照for的形式进行迭代,就需要定以__iter__方法。
2. An object can function as an iterator if it implements next(). Container-like objects usually support protocol 1. Iterators are currently required to support both protocols. The semantics of iteration come only from protocol 2; protocol 1 is present to make iterators behave like sequences; in particular so that code receiving an iterator can use a for-loop over the iterator.一个对象只要定义了next()方法可以像一个迭代器一样运行,但是像列表,元组之类的元素的容器的话通常也支持协议1,现在的迭代器一般都支持两个协议,但是含义上的迭代其仅仅需要支持协议2就行。协议1的目的就是能够像序列一样,能够通过for-loop的方式进行遍历
Classes can define how they are iterated over by defining an __iter__() method; this should take no additional arguments and return a valid iterator object. A class that wants to be an iterator should implement two methods: a next() method that behaves as described above, and an__iter__()method that returns self. 一个类可以通过定义方法__iter__来指定它迭代的方式,这个方法不接受额外的参数,并且返回一个有效的迭代器对象。一个类如果像成为一个迭代器的话,需要定义两个方法,一个是next(),另一个是iter()返回它自己。
只有当你拥有这两个方法的时候你才能够进行迭代,我们平常说列表,元组等是一个可迭代对象比如下面的例子。
for i in A的流程:
步骤1:先调用方法iter(A),将其转化为iterator对象; 然后对iter(A)调用next(iter(A))方法,返回值给i;
步骤2:次就是对该iterator对象进行next方法调用,如此循环进行步骤2,直到没有元素可以迭代,返回‘StopIterator’ 提示迭代结束
>>> for i in (1,2,3):
... print(i)
...
1
2
3
对内置对象,我们必须先对in后面的对象进行iter()方法的调用,然后才会产生一个拥有next()方法的对象,然后执行iter()返回对象的next方法,赋值给target variable.然后循环这种操作,从而实现迭代。
>>> a=(1,2,3)
>>> next(a)
TypeError: tuple object is not an iterator
>>> dir(a) # tuple只有iter/init方法,并没有next方法
['__add__', ..., '__init__', '__iter__', ..., 'count', 'index'] >>> i=iter(a) # 把元组(1,2,3)转换成迭代对象
>>> dir(i) # 检查发现i多了一个__next__方法
['__class__', ... '__init__', '__iter__', ... '__next__', ...]>>> next(i)
1
>>> next(i)
2
>>> next(i)
3
>>> next(i)
Traceback (most recent call last):File "<stdin>", line 1, in <module>
StopIteration
自定义fibonacci检验for循环处理的流程
class Fib:def __init__(self,max,min): #多加一个参数min,我是想检验是不是实参是不是与init进行对应self.max = max #通过这种方式把max设置为自己的状态信息,因为max对下面是不可见的 self.min = min print ('%d: from init' % max)print ('%d: from init' % min)def __iter__(self):self.a = 0self.b = 1print(self.max) #在这里max不可见,只能访问self.max这个函数状态信息print(self.min)return selfdef __next__(self): #在python3必须定义为__next__,在python2可以定义为next()方法 fib = self.aif fib > self.max:raise StopIterationself.a , self.b = self.b, self.a + self.breturn fib
测试用例及输出结果
>>> for i in Fib(4,9):
... print(i, end=', ')
...
4: from init #init只会在刚开始访问一次
9: from init
4 #iter也只是访问一次
9
0, 1, 1, 2, 3, >>> #对iterator对象迭代进行next()操作
下面的例子用于说明我们概念上的iterator,只需类拥有next()方法就行(针对自定义对象)
class Fib:def __init__(self,max):self.max = maxself.a =0self.b =1def __next__(self):fib = self.aif fib > self.max:raise StopIterationself.a , self.b = self.b, self.a + self.breturn fib
运行用例及输出结果
>>> i=Fib(4)
>>> next(i)
0
>>> next(i)
1
>>> next(i)
1
参考文献
PEP 234 -- Iterators
5.5. Iterator Types
http://www.cnblogs.com/itech/archive/2011/01/19/1939119.html
Learning python
Python 中iterator相关推荐
- Python 中 Iterator和Iterable的区别
Python中 list,truple,str,dict这些都可以被迭代,但他们并不是迭代器.为什么? 因为和迭代器相比有一个很大的不同,list/truple/map/dict这些数据的大小是确定的 ...
- 理解 Python 中的 for 循环
译者注: 本文翻译自 Trey Hunner 于 2019 年 6 月 18 日发表的文章 Loop Better: a deeper look at iteration in Python 文中括号 ...
- python中的生成器和迭代器:Generator和Iterator以及yield
文章目录 Iterator Generator 构造生成器 Iterator 即迭代器,源自可迭代对象,例如list,tuple,dict,set,str等(凡是含有__iter__方法的,都是可迭代 ...
- python iterator iterable_Python中Iterator和Iterable的区别
python中list, str,truple, dict都是可以被迭代的,但他们不是迭代器.why? list/truple/map/dict这些数据的大小是确定的,我们可以准确知道他们的size ...
- python——循环器(iterator)中count、cycle和repeat函数用法
前言:本文讲解涉及到python中next()函数和join函数,不清楚可以查看下面博客自行了解. python--next()函数_xiaofengdada的博客-CSDN博客 python--jo ...
- pythonfor循环遍历list_为什么for循环可以遍历list:Python中迭代器与生成器
1 引言 只要你学了Python语言,就不会不知道for循环,也肯定用for循环来遍历一个列表(list),那为什么for循环可以遍历list,而不能遍历int类型对象呢?怎么让一个自定义的对象可遍历 ...
- python中raise stoplteration_推导表达式迭代器生成器模块和包 | 编程电脑技术交流...
魔法方法需要特定的条件去触发 有next是迭代器 # li = [] # for i in range(1,10): # li.append(i) # print(li) # ------------ ...
- python中append函数合并列表且列表内数字从高到低_35个高级Python知识点总结
No.1 一切皆对象 众所周知,Java中强调"一切皆对象",但是Python中的面向对象比Java更加彻底,因为Python中的类(class)也是对象,函数(function) ...
- 在Python中,如何确定对象是否可迭代?
有没有类似isiterable的方法? 到目前为止,我发现的唯一解决方案是致电 hasattr(myObj, '__iter__') 但是我不确定这有多愚蠢. #1楼 根据Python 2词汇表 ,可 ...
最新文章
- php过滤非法字符函数,利用php怎么对非法字符进行过滤
- 设计模式总结 (2)创建型模式
- 如何在 IDEA 使用Debug 图文教程
- 后端:414 Request-URI Too Large解决方案
- 如何在UI设计中制作完美阴影
- MongoDB:有人敢像我一样说出开源的真实用意吗?
- 稳压电源通过什么样的当时分类,怎么去分类
- VS2015 CDKEY
- keil5生成bin文件和axf文件
- android 8 刷机教程视频教程,教你Android 8.0的刷机教程
- A survey of network-based intrusion detection data sets翻译二(5-8)
- minigui 编译与使用
- 财务转换工具 - 人民币金额转大写工具类 java 版本
- Simulink之S-function函数笔记之二
- python 小游戏 《孙悟空大战白骨精》
- 使用基因组圈图表示变异在基因组内位置|R circlize包
- 帮推|基于深度学习的图像融合方法综述
- Xcode 更改默认版本 xcode-select
- 排序算法之鸡尾酒排序
- 联发科 MK8675 5G modem资料
热门文章
- 计算机毕业设计ssm文理读书分享平台8xkh2系统+程序+源码+lw+远程部署
- 雷诺手表如何查真假?如何判断雷诺手表是否为真品?
- 如何做用户画像分析?
- 微信域名防封技术,我们应该如何解决屏蔽拦截
- statgraphics画Multifactor ANOVA图
- hangman游戏c语言,英语游戏 猜词游戏hangman
- 安装mysql提示oxc000007b_重装win7系统黑屏提示oxc000007b怎么办
- OpenCV —— 特征点检测之 SIFT 特征检测器
- aelf Enterprise 0.8.0 beta有奖公测,“Bug奖金计划”重磅开启
- stm32 串口2空闲中断死机_STM32串口空闲中断问题