什么是迭代器?
迭代器可以让我们访问集合的时候变得非常方便。之前我们通过for...in...
的方式访问一个集合的时候,就是使用迭代器完成的。如果没有迭代器,那么我们只能通过while
循环,每次循环的时候通过下标访问了。
可迭代对象
可以直接使用for
循环遍历的对象,成为可迭代的对象,常见的可迭代的对象有:list
、tuple
、dict
、set
、str
以及生成器。
更加专业的判断一个对象是否是可迭代的对象是:这个对象有一个__iter__
方法,并且这个方法会返回一个迭代器对象,这种对象就叫做可迭代的对象。
isinstance() 判断对象是否可迭代
ret = isinstance([1,2,3],Iterable)
print(ret) #ret的值为True
自定义迭代器
class MyRangeIterator(object):
"""
迭代器
"""
def __init__(self,start,end):
self.index = start
self.end = end
def __next__(self):
if self.index < self.end:
index = self.index
self.index += 1
return index
else:
raise StopIteration()
class MyRange(object):
"""
可迭代对象
"""
def __init__(self,start,end):
self.start = start
self.end = end
def __iter__(self):
return MyRangeIterator(self.start,self.end)
# 初始化一个可迭代的对象
for x in MyRange(1,10):
print(x)
这里有两个重要对的魔术方法,__iter__与__next__。魔术方法不会被显式的调用,只有在for in 遍历这个对象时,会先调用__iter__获得一个迭代器,然后再调用这个迭代器的__next__方法获取可迭代对象。魔术方法会被隐式的执行的!这个过程也是f用for遍历的底层做的事情。
想获得一个迭代器必须经过__iter__,要想获得可迭代对象就要使用__next__方法,两者天生一对,不可或缺!
iter(x)
方法
有时候我们拥有了一个可迭代的对象,我们想要获取这个迭代器,那么可以通过iter(x)
方法获取这个可迭代对象的迭代器。
# 使用itre函数将可迭代的对象转换为迭代器
range_iterator = iter(MyRange(1,10))