python迭代器
什么是可迭代对象
可迭代对象:能使用for进行循环访问的对象,比如:list、tuple、dict、str等,可以迭代的对象都有一个__iter__方法,该方法会返回一个迭代器。
判断一个对象是否可以迭代,如果可以迭代则a的值为Ture。
from collections import Iterable
L = [1,3,5]
a = isinstance(L,Iterable)
#如果我们定义了一个类,里面含有__iter__这个方法,则属于该类的对象使用上述判断方法a的值也会为Ture
class Test1(object):
def __iter__(self):
pass
test1 = Test1()
a = isinstance(test1,Iterable)
什么是迭代器
返回可迭代对象数据的对象,使用for循环遍历可迭代对象时,都会调用迭代器的__next__方法
在python3中如果有一个对象中含有__iter__方法和__next__方法(python2中对next方法),则该对象属于迭代器对象,使用Iterator进行判断
from collections import Iterator
class Test2(object):
def __iter__(self):
pass
def __next__(self):
pass
test2 = Test2()
a = isinstance(test2,Iterator)
自定义一个可迭代对象
class Test3Iterator(object):
"""
Test3的迭代器
"""
def __init__(self,start,end):
self.index = start
self.end = end
def __iter__(self):
return self
def __next__(self):
#使用for循环每遍历一次都会执行这个方法一次
if self.index < self.end:
self.temp = self.index
self.index += 1
return self.temp
else:
#一旦抛出StopIteration()这个异常,则for停止遍历
raise StopIteration()
class Test3(object):
"""
Test3是可迭代的对象
"""
def __init__(self,start,end):
self.start = start
self.end = end
def __iter__(self):
#返回一个迭代器对象
return Test3Iterator(self.start,self.end)
for i in Test3(1,10):
#输出1~9
print(i)
for循环原理
事实上for循环底层的原理就是得到可迭代对象的迭代器,不断的执行迭代器的__next__方法,直到抛出异常,我们可以使用while循环来模拟这个过程。
我们可以使用iter()来得到可迭代对象的迭代器。
test3_iterator = iter(Test3(1,10))
while(True):
try:
i = test3_iterator.__next__()
print(i)
except StopIteration():
break
其他的补充
一个对象既可以是可迭代对象也可以是一个迭代器,这种形式的可迭代对象只能用for遍历一次。
class Test4(object):
"""
Test4既是可迭代的对象也是迭代器
"""
def __init__(self,start,end):
self.index = start
self.end = end
def __iter__(self):
#返回一个迭代器对象,即返回自己
return self
def __next__(self):
#使用for循环每遍历一次都会执行这个方法一次
if self.index < self.end:
self.temp = self.index
self.index += 1
return self.temp