1. 迭代器
__iter__
是迭代规则(iterator potocol)的基础,对象如果没有它,就不能返回迭代器,就没有next()方法,就不能迭代。
__iter__()
是类中的核心,它返回迭代器本身,一个实现了__iter__()
方法的对象,即意味着是可迭代的。含有next()的对象,就是迭代器,并且在这个方法中,在没有元素的时候要发起 StopIteration()异常
Class Fibs:
def __init__(self, max):
self.max = max
self.a = 0
self.b = 1
def __iter__(self):
return self
def next(self):
flib = self.a
if fib > self.max:
raise StopIteration
self.a, self.b = self.b, self.a + self.b
return flib
if __name__ == "__main__":
flibs = Flibs(5)
print list(fibs)
[0, 1, 1, 2, 3, 5]
2. 生成器
- 简单的生成器
gen = (x*x for x in range(4))
In [24]: gen
Out[24]: <generator object <genexpr> at 0x7f18a06dac80>
In [25]: for i in gen:
....: print i
....:
0
1
4
9
In [26]: for i in gen:
print i
....:
这和列表推导 [x*x for x in range(4)] 是不一样的,列表推导返回的是一个列表对象。可以多次打印,看上面的例子可以发现,第二次打印没有结果。这是迭代器所具有的,迭代器(生成器是迭代器)的优势在于少占内存
# sum里面不需要再加一层括号
sum(i*i for i in range(10))
not
sum([i*i for i in range(10)])
- yield
yield是生成器的标志, 含有yield语句的函数称为生成器。生成器是一种用普通函数语法定义的迭代器,在定义过程中并没有像迭代器那样写 iter() 和 next(), 只是用了yiel语句,函数就成了生成器,具备迭代器的功能特性。
def g():
yield 0
yield 1
yield 2
for i in g():
print i
0
1
2