python迭代器以及生成器

迭代,即重复做一些事很多次,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 StopIteration

print '迭代器的输出结果:'
for i in Fab(5):
    print i
输出结果:

python迭代器以及生成器_第1张图片


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

python迭代器以及生成器_第2张图片

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

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

def fab(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1

print '生成器生成的结果:'

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 False

def 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,) + result

def prettyprint(solution):
    def line(pos, lenth = len(solution)):
        return '. '*(pos) + 'X ' + '. '*(lenth - pos -1)
    for pos in solution:
        print line(pos)

i = 1
for solution in nQueens():
    print '第%d种放置情况' % (i)
    prettyprint(solution)
    i += 1



你可能感兴趣的:(python迭代器以及生成器)