美文网首页
python入门(三)迭代器和生成器

python入门(三)迭代器和生成器

作者: 淡漠不淡漠 | 来源:发表于2019-11-08 09:50 被阅读0次

    迭代器

    • 迭代器可以记住遍历位置的对象
    • list、tuple、dict都只是可以迭代的对象,不是迭代器,所以要创建一个迭代器
    • 迭代器的俩个基本方法 iter() 和 next()
    • iter() 用于创建一个迭代器、next() 输出当前位置的对象,只能往前不能后退
    • 从一个简单的例子开始,list 输出前俩个元素
    #!/usr/bin/python3
    num = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    it = iter(num)  #创建迭代器
    print(next(it))
    print(next(it))
    #输出结果
    1
    2
    
    • 如何用于for循环呢
    #!/usr/bin/python3
    num = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    it = iter(num)
    for x in it:
        print(x)
    #输出结果
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    • 使用next()方法来遍历呢
    • next()遍历到最后的时候会抛出StopIteration异常,捕获然后跳出循环
    #!/usr/bin/python3
    num = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    it = iter(num)
    while True:
        try:
            print(next(it))
        except StopIteration:
            break
    #输出结果 同上
    

    生成器

    • 生成器是迭代器的一种
    • 使用yield函数 就像单步调试一样记住当前执行的位置,使用next()之后会从原来的位置继续执行。
    • 先来个简单的例子看下怎么使用
    #!/usr/bin/python3
    def foo():
        while True:
            yield 4
            print('end....')
    
    f = foo()
    print(next(f))
    print('中间')
    print(next(f))
    #输出结果
    4
    中间
    end....
    4
    
    • 使用def 定一个了一个函数foo,单独看这个函数while循环一直是true,这里先把yield 看成return返回4
    • f = foo() 将函数赋值给了f
    • 执行print(next(f)) 会先输出4
    • 由于使用了yield 所以函数不会继续执行
    • 那就执行print('中间') 输出了 ‘中间’
    • print(next(f)) 这次再次执行会在原来的执行位置继续执行 print('end....')
    • 最后while继续执行输出 4

    总结一下:其实从例子完全可以看出, yield会返回一个结果,并且记住当前执行的位置,通过使用next() 会在原来执行的位置继续执行程序。

    来一个稍微复杂点的,使用生成器实现斐波那契数列

    #!/usr/bin/python3
    def foo(n):
        a, b, item = 0, 1, 1
        while True:
            if(item > n):
                return
            yield b
            a, b = b, a+b
            item+=1
    
    f = foo(10)
    while True:
        try:
            print(next(f))
        except StopIteration:
            print('end...')
            break
    
    #输出结果
    1
    1
    2
    3
    5
    8
    13
    21
    34
    55
    end...
    

    相关文章

      网友评论

          本文标题:python入门(三)迭代器和生成器

          本文链接:https://www.haomeiwen.com/subject/oifibctx.html