生成器

作者: qianranow | 来源:发表于2018-05-02 14:13 被阅读144次

    0. 概念


    • 理解:一种特殊的 迭代器
    • 特性
      1. 惰性计算数据,节省内存
      2. 能够记录状态,并通过 next() 函数,访问下一个状态
      3. 具备可迭代特性
      

    1. 创建方式


    • 生成器表达式
      l = (i for i in range(1, 10000000) if i % 2 == 0)
      print(next(l))
      print(l.__next__())
      for i in l:
          print(i)
      
    • 生成器函数
      1. 函数中包含 yield 语句
      2. 函数返回值就是生成器
      
      def generators():
          yield 1
          print("a")
          yield 2
          print("b")
          yield 3
          print("c")
      g = generators()
      print(next(g))
      print(g.__next__())
      for i in g:
          print(i)
      

    2. 获取数据方式


    • next()
      def generators():
          yield 1
          print("a")
          yield 2
          print("b")
          yield 3
          print("c")
      g = generators()
      print(next(g))
      print(next(g))
      print(next(g))
      
    • g.__next__()
      def generators():
          yield 1
          print("a")
          yield 2
          print("b")
          yield 3
          print("c")
      g = generators()
      print(g.__next__())
      print(g.__next__())
      print(g.__next__())
      
    • for in
      def generators():
          yield 1
          print("a")
          yield 2
          print("b")
          yield 3
          print("c")
      g = generators()
      for i in g:
          print(i)
      

    3. send


    • 形式
      """
      作用:可以指定上一次被挂起的 yield 语句的返回值
      语法:g.send(value)
      注意:第一次调用, g.send(None)
      """
      def generators():
          res = yield 1
          print("a")
          print(res)
          yield 2
          print("b")
          yield 3
          print("c")
      g = generators()
      print(g.send(None))
      print(g.send(66666))
      

    4. close


    • 形式
      """
      作用:关闭生成器
      语法:g.close()
      注意:后续若继续获取数据, 会报出 StopIteration 异常提示
      """
      def generators():
          yield 1
          print("a")
          yield 2
          print("b")
          yield 3
          print("c")
      g = generators()
      print(g.__next__())
      print(g.__next__())
      g.close()
      print(g.__next__())
      
    • 注意
      1. 遇到 return, 会直接终止获取数据; 后续若继续获取数据, 会报出 StopIteration 异常提示
      def generators():
          yield 1
          print("a")
          yield 2
          print("b")
          return
          yield 3
          print("c")
      g = generators()
      print(g.__next__())
      print(g.__next__())
      print(g.__next__())
      
      2. 生成器只会遍历一次
      def generators():
          yield 1
          print("a")
          yield 2
          print("b")
          yield 3
          print("c")
      g  = generators()
      for i in g:
          print(i)
      g = generators()
      for i in g:
          print(i)
      

    相关文章

      网友评论

          本文标题:生成器

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