python学习9 -迭代器,生成器
迭代:
迭代 就是 重复做一些事情多次(就像循环),实际上,只要实现了 __iter__方法的对象,就能就行迭代。
__iter__方法返回一个迭代器,他具有 next()方法,,在调用next()方法时,迭代器会返回下一个值,如果没有值可以返回,则会引发一个StopIteration异常。
迭代 相对于 列表的优势:迭代 在使用时是 计算一个值时获取一个值,而列表是一次性获取所有值。如果有很多值,列表就会占用太多的内存。
示例如下:
1 >>> class Fibs: 2 def __init__(self): 3 self.a = 0 4 self.b = 1 5 def next(self): 6 self.a ,self.b = self.b,self.a + self.b 7 return self.a 8 def __iter__(self): 9 return self
上面的代码中,迭代器实现了__iter__方法,这个方法实际上返回迭代器本身,在很多情况下,__iter__会放到其他的会在for循环的使用的对象中。
ps:正确的说法,一个实现了 __iter__方法的对象是可迭代的,一个实现了next方法的对象是迭代器
1 >>> fibs = Fibs() 2 >>> for f in fibs: 3 if f > 1000: 4 print f 5 break 6 7 8 1597
内建函数 iter 可以从可迭代的对象中获取迭代器。
>>> it = iter((1,2,3)) >>> it.next() 1 >>> it.next() 2 >>> it.next() 3 >>> it.next() Traceback (most recent call last): File "<pyshell#22>", line 1, in <module> it.next() StopIteration
生成器
含有 yield 语句的函数就叫生成器,他不想return 那样返回值(返回多个值),而是每次产生一个值,函数就会被冻结:即函数停在那点等待被激活,函数被激活后就从停止的那点开始执行。
示例如下:
1 >>> def flatten(lis): 2 for sublist in lis: 3 for element in sublist: 4 yield element
1 >>> for num in flatten(lis): 2 print num 3 4 1 5 2 6 3 7 4 8 5 9 >>> list(flatten(lis)) 10 [1, 2, 3, 4, 5]