python 迭代器和可迭代对象,python迭代器是什么
仅供参考,转载请注明出处。
迭代器迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有元素都被访问。迭代器只能向前,不能向后。
1.可迭代对象。我们已经知道,我们可以使用循环语法.在.从列表、元组、字符串和其他类型数据中获取数据以供使用。我们称这个过程为遍历,也叫迭代。
但是,是否所有数据类型都可以放入for的语句中.在.然后让.在.一次拿出一个数据给我们用,就是给我们迭代?
比如integer int的数据是不能迭代的。
在[1]中:对于100中的I:
.打印(一)
.
-
类型错误回溯(最近一次调用)
模块()中的ipython-input-1-86150fa0c47d
- 1代表100分之一的I:
第二版(一)
三
type error:“int”对象不可迭代
在[2]:从上面可以看到错误消息TypeError: int 对象不可迭代,说明int不是迭代类型。
那么类是迭代类型吗?
在[2]中:类MyList(对象):
.def __init__(self):
.self.list=[]
.定义添加(自身,项目):
.self.list.append(项目)
.
In [3]: mylist=MyList()
In [4]: mylist.add(1)
In [5]: mylist.add(2)
In [6]: mylist.add(3)
在[8]中:对于我的列表中的编号:
.打印(数字)
.
-
类型错误回溯(最近一次调用)
模块()中的ipython-input-8-1e13316c02cd
- 1表示我的列表中的数量:
2份打印(数量)
三
TypeError:“my list”对象不可迭代
在[9]中:对于mylist.list中的编号:
.打印(数字)
.
一个
2
三
在[10]:从上面可以看出,即使一个类的值被定义为list的迭代类型,它自己的类也不是迭代类型。其实写的过程肯定有问题。
如果重写它,使类成为迭代类型,会怎么样呢?
2.如何确定一个对象是否可以迭代?您可以使用isinstance()来确定一个对象是否是可迭代对象:
In [10]:从集合导入Iterable
在[11]中:isinstance([],Iterable)
Out[11]:真
In [12]: isinstance({},Iterable)
Out[12]:真
In [13]: isinstance(hello ,Iterable)
Out[13]:真
In [14]: isinstance(mylist,Iterable)
Out[14]:假
In [15]: isinstance(100,可迭代)
Out[15]:假
In [16]:从上面的执行,list,dict,string等。都是可迭代的对象类型,而mylist instance和100不是。
3.可迭代对象的本质。我们分析了迭代使用iterable对象的过程,发现每次迭代(即for中的每次循环.在.)将返回对象中的下一条数据,并反向读取数据,直到所有数据都被迭代。那么,在这个过程中,应该有一个“人”来记录每次访问了哪一段数据,这样每次迭代才能返回下一段数据。我们把这个能帮我们迭代数据的“人”叫做迭代器。迭代对象的本质就是可以给我们提供这样一个中间的“人”,也就是迭代器,来帮助我们迭代。迭代对象通过_ _ iterator _ _方法为我们提供了一个迭代器。我们在迭代一个迭代器的时候,实际上是先得到一个对象提供的迭代器,然后通过这个迭代器依次得到对象中的每一个数据。那么,带有_ _ iterator _ _方法的对象就是可迭代对象。将__iter__方法添加到前面的Mylist类中,然后检查该对象是否是可迭代对象。
在[16]:类MyList(对象):
.def __init__(self):
.self.list=[]
.定义添加(自身,项目):
.self.list.append(项目)
.def __iter__(self):
.通过
.
在[18]中:mylist=MyList()
In [19]: isinstance(mylist,Iterable)
Out[19]:真
在[20]中:此测试发现带有__iter__方法的mylist对象已经是迭代对象。
4.iter()函数和next()函数列表、元组等。都是可迭代的对象。我们可以通过iter()函数得到这些可迭代对象的迭代器。然后我们可以在迭代器上使用next()函数来获取下一个数据。iter()函数实际上调用了iterable对象的__iter__方法。#创建列表
在[20]中:李=[1,2,3,4,5]
#将列表放入迭代器中
在[21]中:li_iter=iter(li)
#调用next方法打印迭代器的内容。
在[22]:下一个(li_iter)
Out[22]: 1
在[23]:下一个(li_iter)
Out[23]: 2
在[24]:下一个(li_iter)
Out[24]: 3
在[25]:下一个(li_iter)
Out[25]: 4
在[26]:下一个(li_iter)
Out[26]: 5
# Iterator next没有数据。此异常类似于作为while方法的中断条件。
在[27]:下一个(li_iter)
-
StopIteration Traceback(最近一次调用)
模块()中的ipython-input-27-ab6a83f394a1
- 1下一个(li_iter)
停止迭代:
在[28]中:注意,当我们已经迭代完最后一个数据后,再次调用next()函数会抛出StopIteration异常,告诉我们所有数据都已经迭代完了,所以我们不需要再执行next()函数了。
5.迭代器迭代器通过上面的分析,我们已经知道迭代器是用来帮助我们记录每次迭代所访问的位置的。当我们在迭代器上使用next()函数时,迭代器会将它记录的位置的下一个位置的数据返回给我们。实际上在使用next()函数时,调用的是迭代器对象的__next__方法(在Python3中是对象的__next__方法,在Python2中是对象的next()方法)。所以,如果我们想构造一个迭代器,我们必须实现它的__next__方法。但这还不够。python要求迭代器本身是迭代的,所以我们要为迭代器实现_ _ iterator _ _方法,而_ _ iterator _ _方法返回一个迭代器。迭代器本身就是迭代器,所以迭代器的_ _ iterator _ _方法返回自身。实现__iter__方法和next()方法的对象是迭代器。在[21]:类MyList(对象):
.def __init__(self):
.self.list=[]
.自电流=0
.
.定义添加(自身,变量):
.self.list.append(var)
.
.定义下一个(自己):
.如果self.current len(self.list):
.item=self.list[self.current]
.自电流=1
.退货项目
.否则:
.引发StopIteration
.
.def __iter__(self):
.回归自我
.
在[22]中:
In [22]: mylist=MyList()
In [23]: isinstance(mylist,Iterable)
Out[23]:真的
In [24]: mylist.add(1)
In [25]: mylist.add(2)
In [26]: mylist.add(3)
In [27]: mylist.next()
Out[27]: 1
In [28]: mylist.next()
Out[28]: 2
In [29]: mylist.next()
Out[29]: 3
In [30]: mylist.next()
-
StopIteration Traceback(最近一次调用)
模块()中的ipython-input-30-1897446021c8
- 1 mylist.next()
ipython-input-21-110 aa 633 e 856 in next(self)
13退货项目
14其他:
- 15提升停止迭代
16
17 def __iter__(self):
停止迭代:
在[31]中:
在[31]中:
In [31]: mylist=MyList()
In [32]: mylist.add(1)
In [33]: mylist.add(2)
In [34]: mylist.add(3)
在[35]中:对于我的列表中的编号:
.打印(数字)
.
一个
2
三
在[36]:从上面的代码可以看出,python2使用next方法后,就有可能通过使用for循环迭代调用next并打印。
6.for的本质.在.循环Iterable循环中for item的本质是首先通过iterator()函数获取Iterable对象的迭代器,然后调用next()方法获取下一个值并赋给item。当遇到StopIteration异常时,循环结束。
7.迭代器的应用场景。我们发现迭代器的核心功能是通过调用next()函数返回下一个数据值。如果每次返回的数据值不是在已有的数据集中读取,而是通过程序按照一定的规则计算生成,就意味着不需要依赖已有的数据集,也就是说不需要缓存所有要迭代一次的数据供后续读取,可以节省大量的存储(内存)空间。
比如数学中有一个著名的斐波那契数列,第一个数字是0,第二个数字是1,后面的每个数字都可以通过前两个数字相加得到:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34,
现在我们想遍历迭代斐波那契数列中的前n个数字.在.循环。然后这个斐波那契数列可以用迭代器来实现,每次迭代通过数学计算生成下一个数。
#编码=utf-8
类FibIterator(对象):
斐波那契序列迭代器
def __init__(self,n):
:param n: int,指示生成的序列中第一个n的编号。
self.n=n
# current用于将当前生成的数字保存到序列中。
自电流=0
# num1用于保存之前的数字,初始值为0,序列中的第一个数字。
self.num1=0
# num2用于存储前一个数,初始值为序列中的第二个数1。
self.num2=1
定义下一个(自己):
由next()函数调用以获取下一个数字
if self.current self.n:
num=self.num1
self.num1,self.num2=self.num2,self.num1 self.num2
自电流=1
退货数量
否则:
提升停止迭代
def __iter__(self):
迭代器的__iter__返回自身
回归自我
if __name__==__main__ :
fib=FibIterator(10)
对于光纤中的数量:
Print(num)按如下方式执行:
g:\ python 27 \ python . exe F:/python project/Iter/Iter . py
0
一个
一个
2
三
五
八
13
21
38.不仅仅是for循环可以接收iterable对象。除了for循环,链表,元组等。也可以接收可迭代的对象。
if __name__==__main__ :
fib=FibIterator(10)
对于光纤中的数量:
打印(数字)
#使用列表接收
li=list(FibIterator(15))
打印(李)
#用tunple接收
tp=tuple(FibIterator(6))
打印(tp)按如下方式执行:
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
(0, 1, 1, 2, 3, 5)
关注微信微信官方账号,回复【数据】,Python,PHP,JAVA,web,即可获取Python,PHP,JAVA,前端等视频数据。
来自海洋的渔夫原创作品,
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。