




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、我们将要来学习python的重要概念迭代和迭代器,通过简单实用的例子如列表迭代器和xrange。可迭代一个对象,物理或者虚拟存储的序列。list,tuple,strins,dicttionary,set以及生成器对象都是可迭代的,整型数是不可迭代的。如果你不确定哪个可迭代哪个不可以,你需要用python内建的iter()来帮忙。>>> iter(1,2,3)<listiterator object at 0x026C8970>>>> iter(1:2, 2:4)<dictionary-keyiterator object at 0x026C
2、C1B0>>>> iter(1234)Traceback (most recent call last): File "<pyshell#145>", line 1, in <module> iter(1234)TypeError: 'int' object is not iterableiter()为list返回了listiterator对象,为dictionary返回了dictionary-keyiterator对象。类似对其他可迭代类型也会返回迭代器对象。iter()用在自定义的类型会怎样呢?我们先自己定
3、义一个String类:class String(object): def _init_(self, val): self.val = val def _str_(self): return self.valst = String('sample string')那么,st是可迭代的吗?>>> iter(st)TypeError: 'String' object is not iterable你可能会有几个问题要问:· 怎么让自定义的类型可迭代?· iter()究竟做了些什么?让我们补充String类来找找答案class St
4、ring(object): def _init_(self, val): self.val = val def _str_(self): return self.val def _iter_(self): print "This is _iter_ method of String class" return iter(self.val) #self.val is python string so iter() will return it's iterator>>> st = String('Sample String')>
5、>> iter(st)This is _iter_ method of String class<iterator object at 0x026C8150>在String类中需要一个_iter_方法把String类型变成可迭代的,这就是说iter内部调用了iterable._iter_()别急,不是只有增加_iter()方法这一种途径class String(object): def _init_(self, val): self.val = val def _str_(self): return self.val def _getitem_(self, index)
6、: return self.valindex>>> st = String('Sample String')>>> iter(st)<iterator object at 0x0273AC10>itr也会调用iterable._getitem_(),所以我们用_getitem_方法让String类型可迭代。如果在String类中同时使用_iter_()和_getitem_(),就只有_iter_会起作用。自动迭代for循环会自动迭代for x in iterable: print x我们可以不用for循环来实现吗?def iter
7、ate_while(iterable): index = 0 while(i< len(iterable): print iterablei i +=1这样做对list和string是管用的,但对dictionary不会奏效,所以这绝对不是python式的迭代,也肯定不能模拟for循环的功能。我们先看迭代器,等下回再过头来。迭代器关于迭代器先说几条.· 1. 迭代器对象在迭代过程中会会产生可迭代的值,next()或者_next()_是迭代器用来产生下一个值的方法。· 2. 它会在迭代结束后发出StopIteration异常。· 3. iter()函数返回迭代
8、器对象· 4. 如果iter()函数被用在迭代器对象,它会返回对象本身我们试一试模仿for循环def simulate_for_loop(iterable): it = iter(iterable) while(True):try: print next(it)except StopIteration: break>>> simulate_for_loop(23,12,34,56)23123456前面我们看过了iterable类,我们知道iter会返回迭代器对象。现在我们试着理解迭代器类的设计。class Iterator: def _init_(self, ite
9、rable) self.iterable = iterable . . def _iter_(self): #iter should return self if called on iterator return self def next(self): #Use _next_() in python 3.x if condition: #it should raise StopIteration exception if no next element is left to return raise StopIteration我们学了够多的迭代和迭代器,在python程序中不会用到比这更深
10、的了。但是为了学习的目的我们就到这儿。列表迭代器你可能会在面试中写这个,所以打起精神来注意了class list_iter(object): def _init_(self, list_data): self.list_data = list_data self.index = 0 def _iter_(self): return self def next(self): #Use _next_ in python 3.x if self.index < len(self.list_data): val = self.list_dataself.index self.index += 1
11、 return val else: raise StopIteration()我们来用list_iter自己定义一个列表迭代器class List(object): def _init_(self, val): self.val = val def _iter_(self): return list_iter(self.val)>>> ls = List(1,2,34)>>> it = iter(ls)>>> next(it)1>>> next(it)2>>> next(it)34>>>
12、 next(it)Traceback (most recent call last): File "<pyshell#254>", line 1, in <module> next(it) File "<pyshell#228>", line 13, in next raise StopIteration()StopIterationxrange从一个问题开始xrange是迭代还是迭代器?我们来看看>>> x = xrange(10)>>> type(x)<type '
13、xrange'>几个关键点:· 1. iter(xrange(num)应该被支持· 2. 如果iter(xrange(num)返回同样的对象(xrange类型)那xrange就是迭代器· 3. 如果iter(xrange(num)返回一个迭代器对象那xrange就是迭代>>> iter(xrange(10)<rangeiterator object at 0x0264EFE0>它返回了rangeiterator,所以我们完全可以叫它迭代器。让我们用最少的xrange函数实现自己的xrangexrange_iteratorclass xrange_iter(object): def _init_(self, num): self.num = num self.start = 0 def _iter_(self): return self def next(self): if self.start < self.num: val = self.start self.start += 1 return val else: raise Sto
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论