美文网首页
Python基础12-函数3(生成器)

Python基础12-函数3(生成器)

作者: Jacob_LJ | 来源:发表于2018-05-12 22:02 被阅读7次
    Python基础-函数

    生成器

    1 概念

    • 是一个特殊的迭代器(迭代器的抽象层更高级)
    • 拥有迭代器的特性
      * 惰性计算数据,节省内存
      * 能够记录状态,并通过 next() 函数,访问下一个状态
      * 具备可迭代特性

    2 创建方式

    • 生成器表达式
      * 把列表推导式的[] 修改成()
    # 列表推导式格式
    # l = [i for i in range(1, 10000000) if i % 2 == 0] # 会立即生成带内容列表
    
    # 生成器 generator 推导式格式
    l = (i for i in range(1, 10000000) if i % 2 == 0)
    
    print(next(l))
    print(next(l))
    print(l.__next__()) # 等价与 调用 next(),同时带有状态记录
    
    # 生成器是特殊迭代器,可以被 for in 进行迭代。
    for i in l:
        print(i)
    
    • 生成器函数
      * 函数体中包含 yield 语句
      * 这个函数的执行结果就是生成器
    # yied, 可以去阻断当前的函数执行, 然后, 当使用next()函数, 或者, __next__(), 
    # 都会让函数继续执行, 然后, 当执行到下一个 yield语句的时候, 又会被暂停
    def test():
        print("xxx")
        yield 1
        print("a")
    
        yield 2
        print("b")
    
        yield 3
        print("c")
    
        yield 4
        print("d")
    
        yield 5
        print("e")
    
    # 下面的 for 循环创建的 test 函数,等价于上面的 test 函数方式
    # def test():
    #     for i in range(1, 9):
    #         yield i
    
    g = test()
    print(g) >>> 获取的g 就是一个生成器
    
    print(next(g)) >>> xxx \n 1
    print(next(g)) >>> a \n 2
    print(next(g)) >>> b \n 3
    print(next(g)) >>> c \n 4
    print(next(g)) >>> error
    

    3 产生数据方式

    • 生成器具备可迭代性
    • next()函数 等价于 生成器.next()
    • for in

    4 send() 方法

    • send 方法有一个参数,指定的是上一次被挂起的 yield 语句的返回值
    • 相比于 .next(),可以额外的给 yield 语句传值
    • 注意,第一次调用 send 方法需要传入 None 参数
    def test():
        print("xxx")
        res1 = yield 1 "ooo"
        print(res1)
    
        res2 = yield 2
        print(res2)
    
    g = test()
    
    print(g.__next__())
    print(g.__next__())
    print(g.send("ooo"))
    print(g.send(None))
    print(g.send(666))
    

    5 关闭生成器

    • g.close()
    • 后续如果继续调用,会抛出 StopIteration异常提示
    def test():
        yield 1
        print("a")
    
        yield 2
        print("b")
    
        yield 3
        print("c")
    
        return 10
    
    
    
    g = test() # 创建生成器
    
    print(g.__next__())
    print(g.__next__())
    
    g.close() # 关闭生成器
    
    print(g.__next__())
    print(g.__next__())
    

    6 注意

    • 如果函数带有 return,进行迭代的时候会直接终止,抛出 StopIteration异常
    • 生成器只会遍历一次,想再次遍历,需要重新生成一次。

    相关文章

      网友评论

          本文标题:Python基础12-函数3(生成器)

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