Python - Generator

    函数体中存在yield关键字,即为生成器。调用生成器函数会返回一个生成器对象。即生成器函数就是生成器工厂。

    生成器是迭代器。

    def …

    Jerry Su Dec 30, 2020 1 mins

      函数体中存在yield关键字,即为生成器。调用生成器函数会返回一个生成器对象。即生成器函数就是生成器工厂。

      生成器是迭代器。

      def gen_123():
          yield 1
          yield 2
          yield 3
      
      gen_123 # 是函数对象
      
      <function __main__.gen_123()>
      
      gen_123() # 调用函数,返回生成器
      
      <generator object gen_123 at 0x7eff859539e0>
      
      # 生成器也是迭代器
      
      g = gen_123()
      
      g.__next__()
      
      1
      
      next(g)
      
      2
      
      next(g)
      
      3
      
      next(g)
      
      ---------------------------------------------------------------------------
      
      StopIteration                             Traceback (most recent call last)
      
      <ipython-input-13-e734f8aca5ac> in <module>
      ----> 1 next(g)
      
      
      StopIteration:
      

      生成器函数会返回一个生成器对象,该对象包装生成器函数的函数体。当next()迭代时,生成器函数会执行到下一个yield语句,返回yield语句的表达式作为产出值,并在当前函数体位置暂停。当函数体执行完毕,最终return返回时会抛出StopIteration异常。

      生成器函数定义体中的return语句会触发生成器对象抛出StopIteration异常

      import re
      
      class Sentence:
          def __init__(self, text):
              self.text = text
              self.words = re.findall("\w+", self.text)
              pass
      
          def __iter__(self):
              for word in self.words:
                  yield word
              return
      
      s = Sentence("hello world!")
      
      iter(s) # 就是一个生成器,也是一个迭代器,__iter__()返回迭代器,则可next()访问。
      
      <generator object Sentence.__iter__ at 0x7eff856f42e0>
      
      iterator1 = iter(s)
      
      next(iterator1)
      
      'hello'
      
      next(iterator1)
      
      'world'
      
      next(iterator1)
      
      ---------------------------------------------------------------------------
      
      StopIteration                             Traceback (most recent call last)
      
      <ipython-input-30-0680f5ec8ce3> in <module>
      ----> 1 next(iterator1)
      
      
      StopIteration:
      
      for w in s:
          print(w)
      
      hello
      world
      
      
      

      Read more:

      Related posts: