Python迭代和迭代器详解

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

我们将要来学习python的重要概念迭代和迭代器,通过简单实用的例子如列表迭代器和xrange。可迭代一个对象,物理或者虚拟存储的序列。list,tuple,strins,dicttionary,set以及生成器对象都是可迭代的,整型数是不可迭代的。如果你不确定哪个可迭代哪个不可以,你需要用python内建的iter()来帮忙。iter([1,2,3])listiteratorobjectat0x026C8970iter({1:2,2:4})dictionary-keyiteratorobjectat0x026CC1B0iter(1234)Traceback(mostrecentcalllast):Filepyshell#145,line1,inmoduleiter(1234)TypeError:'int'objectisnotiterableiter()为list返回了listiterator对象,为dictionary返回了dictionary-keyiterator对象。类似对其他可迭代类型也会返回迭代器对象。iter()用在自定义的类型会怎样呢?我们先自己定义一个String类:classString(object):def__init__(self,val):self.val=valdef__str__(self):returnself.valst=String('samplestring')那么,st是可迭代的吗?iter(st)TypeError:'String'objectisnotiterable你可能会有几个问题要问:怎么让自定义的类型可迭代?iter()究竟做了些什么?让我们补充String类来找找答案classString(object):def__init__(self,val):self.val=valdef__str__(self):returnself.valdef__iter__(self):printThisis__iter__methodofStringclassreturniter(self.val)#self.valispythonstringsoiter()willreturnit'siteratorst=String('SampleString')iter(st)Thisis__iter__methodofStringclassiteratorobjectat0x026C8150在String类中需要一个’__iter__’方法把String类型变成可迭代的,这就是说’iter’内部调用了’iterable.__iter__()’别急,不是只有增加’__iter()’方法这一种途径classString(object):def__init__(self,val):self.val=valdef__str__(self):returnself.valdef__getitem__(self,index):returnself.val[index]st=String('SampleString')iter(st)iteratorobjectat0x0273AC10‘itr’也会调用’iterable.__getitem__()’,所以我们用’__getitem__’方法让String类型可迭代。如果在String类中同时使用’__iter__()’和’__getitem__()’,就只有’__iter__’会起作用。自动迭代for循环会自动迭代forxiniterable:printx我们可以不用for循环来实现吗?defiterate_while(iterable):index=0while(ilen(iterable)):printiterable[i]i+=1这样做对list和string是管用的,但对dictionary不会奏效,所以这绝对不是python式的迭代,也肯定不能模拟for循环的功能。我们先看迭代器,等下回再过头来。迭代器关于迭代器先说几条………..1.迭代器对象在迭代过程中会会产生可迭代的值,`next()`或者`__next()__`是迭代器用来产生下一个值的方法。2.它会在迭代结束后发出StopIteration异常。3.`iter()`函数返回迭代器对象4.如果`iter()`函数被用在迭代器对象,它会返回对象本身我们试一试模仿for循环defsimulate_for_loop(iterable):it=iter(iterable)while(True):try:printnext(it)exceptStopIteration:breaksimulate_for_loop([23,12,34,56])23123456前面我们看过了iterable类,我们知道iter会返回迭代器对象。现在我们试着理解迭代器类的设计。classIterator:def__init__(self,iterable)self.iterable=iterable..def__iter__(self):#itershouldreturnselfifcalledoniteratorreturnselfdefnext(self):#Use__next__()inpython3.xifcondition:#itshouldraiseStopIterationexceptionifnonextelementislefttoreturnraiseStopIteration我们学了够多的迭代和迭代器,在python程序中不会用到比这更深的了。但是为了学习的目的我们就到这儿。。。。列表迭代器你可能会在面试中写这个,所以打起精神来注意了classlist_iter(object):def__init__(self,list_data):self.list_data=list_dataself.index=0def__iter__(self):returnselfdefnext(self):#Use__next__inpython3.xifself.indexlen(self.list_data):val=self.list_data[self.index]self.index+=1returnvalelse:raiseStopIteration()我们来用`list_iter`自己定义一个列表迭代器classList(object):def__init__(self,val):self.val=valdef__iter__(self):returnlist_iter(self.val)ls=List([1,2,34])it=iter(ls)next(it)1next(it)2next(it)34next(it)Traceback(mostrecentcalllast):Filepyshell#254,(it)Filepyshell#228,line13,innextraiseStopIteration()StopIterationxrange从一个问题开始——xrange是迭代还是迭代器?我们来看看x=xrange(10)type(x)type'xrange'几个关键点:1.`iter(xrange(num))`应该被支持2.如果`iter(xrange(num))`返回同样的对象(xrange类型)那xrange就是迭代器3.如果`iter(xrange(num))`返回一个迭代器对象那xrange就是迭代iter(xrange(10))rangeiteratorobjectat0x0264EFE0它返回了rangeiterator,所以我们完全可以叫它迭代器。让我们用最少的xrange函数实现自己的xrangexrange_iteratorclassxrange_iter(object):def__init__(self,num):self.num=numself.start=0def__iter__(self):returnselfdefnext(self):ifself.startself.num:val=self.startself.start+=1returnvalelse:raiseStopIteration()myxrangeclassmy_xrange(object):def__init__(self,num):self.num=numdef__iter__(self):returnxrange_iter(self.num)forxinmy_xrange(10):printx,0123456789我喜欢在这里总结这篇文章,欢迎发表评论和疑问。

1 / 8
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功