1 l=[1,2,3,4] 2 3 for n in l: 4 print n
在看上面这段代码的时候,咱们没有显式的控制列表的偏移量,就能够自动的遍历了整个列表对象。那么for 语句是怎么来遍历列表l的呢?要回答这个问题,咱们必须首先来看一下迭代器相关的知识。python
1.迭代器函数
迭代器对象要求支持迭代器协议,所谓支持迭代器协议就是对象包含__iter__()和next()方法。其中__iter__()方法返回迭代器对象本身;next()方法返回下一个前进到下一个结果,在结尾时引起StopIteration异常。oop
列表不是迭代器对象,可是列表经过__iter__()能够获得一个迭代器对象来遍历整个列表的内容,像列表这样的序列对象都属于这种状况;与序列不一样,文件对象自己就是一种迭代器对象。spa
1 l=[1,2,3,4] 2 f=open('test.c','r') 3 4 iter(l) == l 5 Out[131]: False 6 7 iter (f)== f 8 Out[132]: True
一个迭代器的例子(来源:python tutorial)code
1 class Reverse: 2 """Iterator for looping over a sequence backwards.""" 3 def __init__(self, data): 4 self.data = data 5 self.index = len(data) 6 def __iter__(self): 7 return self 8 def next(self): 9 if self.index == 0: 10 raise StopIteration 11 self.index = self.index - 1 12 return self.data[self.index]
2.生成器对象
生成器使python能够很容易的支持迭代协议。生成器经过生成器函数产生,生成器函数能够经过常规的def语句来定义,可是不用return返回,而是用yeild一次返回一个结果,在每一个结果之间挂起和继续它们的状态,来自动实现迭代协议。blog
一个生成器的例子(来源:python tutorial)ip
3.for语句如何工做it
在咱们最前面的遍历列表的for语句中,for使用了列表支持迭代器的性质,能够每次经过调用迭代器的next()方法,来遍历到列表中的值,直到遇到StopIteration的异常。io
4.注意的问题:
参考: python tutorial, stackoverflow