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

results matching ""

    No results matching ""