【摘】python和它的迭代器

python和它的迭代器

有代码如下:

class CountDown(object):

    def __init__(self, step):

        self.step = step

    def __next__(self):

        if self.step <= 0:
            raise StopIteration
        self.step -= 1
        return self.step

    def __iter__(self):

        return self

if __name__ == '__main__':

    for e in CountDown(4):
        print(e)

当调用for时,
先调用了CountDown的 iter(),
每一次循环则调用了CountDown的 next()

这个过程就像下面一样

>>> i = iter('43210')
>>> next(i)
'4'
>>> next(i)
'3'
>>> next(i)
'2'
>>> next(i)
'1'
>>> next(i)
'0'
>>> next(i)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

python和它的生成器

如果要实现斐波那契数列,该如何实现呢?

不用生成器的话,会写下面的代码

def fibonacci(i):

    if i == 1 or i == 2:
        return 1
    elif i > 2:
        return fibonacci(i-1) + fibonacci(i-2)
    else:
        raise Exception('非法参数')


if __name__ == '__main__':

    print(fibonacci(1))
    print(fibonacci(2))
    print(fibonacci(3))
    for i in range(10):
        print(fibonacci(4+i))

使用生成器的话,会写下面的代码

def fibonacci():
    
    a, b = 0, 1
    while True:
        yield b
        a, b = b, a + b

if __name__ == '__main__':
    
    fib = fibonacci()
    print(next(fib))
    print(next(fib))
    print(next(fib))
    for _ in range(10):
        print(next(fib))

其结果都是

1
1
2
3
5
8
13
21
34
55
89
144
233

基于yield语句,生成器可以暂停函数并返回一个中间结果。该函数会保存执行上下文,稍后在必要时可以恢复。
其中fib,是generator对象,一个特殊的迭代器。

摘自 《Python高级编程》

posted @ 2019-01-22 19:02  白应非  阅读(125)  评论(0编辑  收藏  举报