python none Python 迭代器和

电脑杂谈  发布时间:2018-01-11 20:05:38  来源:网络整理

原标题:Python 迭代器和

在Python中,很多对象都是可以通过for语句来直接遍历的,例如list、string、dict等等,这些对象都可以被称为可迭代对象。至于说哪些对象是可以被迭代访问的,就要了解一下迭代器相关的知识了。

迭代器

迭代器对象要求支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的__iter__()和next()方法。其中__iter__()方法返回迭代器对象本身;next()方法返回容器的下一个元素,在结尾时引发StopIteration异常。

__iter__()和next()方法

这两个方法是迭代器最基本的方法,一个用来获得迭代器对象,一个用来获取容器中的下一个元素。python none

对于可迭代对象,可以使用内建函数iter()来获取它的迭代器对象:

例子中,通过iter()方法获得了list的迭代器对象,然后就可以通过next()方法来访问list中的元素了。python none当容器中没有可访问的元素后,next()方法将会抛出一个StopIteration异常终止迭代器。

其实,当我们使用for语句的时候,for语句就会自动的通过__iter__()方法来获得迭代器对象,并且通过next()方法来获取下一个元素。

自定义迭代器

了解了迭代器协议之后,就可以自定义迭代器了。

下面例子中实现了一个MyRange的类型,这个类型中实现了__iter__()方法,通过这个方法返回对象本身作为迭代器对象;同时,实现了next()方法用来获取容器中的下一个元素,当没有可访问元素后,就抛出StopIteration异常。

classMyRange(object):

def__init__(self,n):

self.idx= 0

self.n= n

def__iter__(self):

returnself

defnext(self):

ifself.idx< self.n:

val= self.idx

self.idx+= 1

returnval

else:

raiseStopIteration()

这个自定义类型跟内建函数xrange很类似,看一下运行结果:

myRange= MyRange(3)

foriinmyRange:

printi

迭代器和可迭代对象

在上面的例子中,myRange这个对象就是一个可迭代对象,同时它本身也是一个迭代器对象。

看下面的代码,对于一个可迭代对象,如果它本身又是一个迭代器对象,就会有下面的 问题,就没有办法支持多次迭代。

为了解决上面的问题,可以分别定义可迭代类型对象和迭代器类型对象;然后可迭代类型对象的__iter__()方法可以获得一个迭代器类型的对象。看下面的实现:

classZrange:

def__init__(self,n):

self.n= n

def__iter__(self):

returnZrangeIterator(self.n)

classZrangeIterator:

def__init__(self,n):

self.i= 0

self.n= n

def__iter__(self):

returnself

defnext(self):

ifself.i< self.n:

i= self.i

self.i+= 1

returni

else:

raiseStopIteration()

zrange= Zrange(3)

printzrange isiter(zrange)

print[iforiinzrange]


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-59867-1.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...