python迭代器以及生成器

来源:互联网 发布:ff14男性捏脸数据 编辑:程序博客网 时间:2024/06/05 00:38

迭代,即重复做一些事很多次,python中通过for循环可以对序列、字典以及其他的对象进行迭代。在其他对象进行迭代时,需要在其他对象中实现__iter__方法。

__iter__方法返回一个迭代器,所谓的迭代器就是具有next方法的对象。在调用next方法时,迭代器会返回它的下一个值。如果next方法被调用,但迭代器没有值可以返回,就会引发一个StopIteration异常。

用迭代器实现一个斐波那契数列

class Fab(object):    def __init__(self,max):        self.max = max        self.n, self.a, self.b = 0, 0, 1    def __iter__(self):        return self    def next(self):        if self.n < self.max:            r = self.b            self.a, self.b = self.b, self.a + self.b            self.n += 1            return r        raise StopIterationprint '迭代器的输出结果:'for i in Fab(5):    print i
输出结果:


除了能够在迭代器和可迭代对象上进行迭代(这是经常做的)外,还能把它们转换为序列。在大部分能够使用序列的情况下,能使用迭代器替换。


生成器,是一种用普通的函数语法定义的迭代器,是包含yield语句的函数。除了名字不同以外,它的行为和普通函数也有很大的差别。这在于它不像return那样产生返回值,而是每次产生多个值。每次产生一个值(使用yield语句),函数机会被冻结:即函数停在那点等待被激活。函数被激活后就从停止的那点开始执行。函数的本地变量和上一次运行的状态一样。

用生成器实现斐波那契数列。

def fab(max):    n, a, b = 0, 0, 1    while n < max:        yield b        a, b = b, a + b        n = n + 1print '生成器生成的结果:'for i in fab(5):    print i

用生成器解决n皇后问题。

def config(state, nextX):    nextY = len(state)    for i in range(nextY):        if abs(nextX - state[i]) in (0,nextY - i):            return True    return Falsedef nQueens(num = 8, state = ()):    if len(state) == num - 1:        for pos in range(num):            if not config(state, pos):                yield (pos,)    else:        for pos in range(num):            if not config(state, pos):                for result in nQueens(num, state + (pos,)):                    yield (pos,) + resultdef prettyprint(solution):    def line(pos, lenth = len(solution)):        return '. '*(pos) + 'X ' + '. '*(lenth - pos -1)    for pos in solution:        print line(pos)i = 1for solution in nQueens():    print '第%d种放置情况' % (i)    prettyprint(solution)    i += 1



0 0
原创粉丝点击