代码之家  ›  专栏  ›  技术社区  ›  Adrian

为什么Python的yield语句不能在一个函数中调用,也不能在它调用的另一个函数中调用,为什么在尝试时不报告错误?

  •  0
  • Adrian  · 技术社区  · 4 年前

    yield 这句话很有用。然而,有件事让我吃惊。放多 函数中的语句将导致在 for var in fn() 产量 语句,则不执行该函数。我只是采取了幼稚的方法,只是认为它会奏效。

    例如。

    def fn2():
        print("blah")
        yield "you"
        
    def fn():
        yield "hi"
        fn2()
        yield "there"
        
    for a in fn():
        print('{}'.format(a))
    

    yield "you"

    hi
    there
    

    hi
    blah
    there
    

    Demo

    没有任何警告或任何类型的错误,它只是耸耸肩并继续执行,这比它不工作更令人惊讶。

    这是怎么回事?

    1 回复  |  直到 4 年前
        1
  •  3
  •   Tomalak    4 年前

    yield 是 发电机 产量 他们的陈述。

    为了获得函数生成的值,必须进行迭代。

    for v in fn2: yield v ,但Python还有一个方便的语句: yield from

    def fn2():
        print("blah")
        yield "you"
        
    def fn():
        yield "hi"
        yield from fn2()
        yield "there"
        
    for a in fn():
        print('{}'.format(a))
    

    Python的生成器是惰性地评估的。创建一个(在本例中) “呼叫 fn2 " )不启动迭代。这就是为什么看起来 fn2 连电话都没打。它被称为。

    fn2 . 一旦您真正开始迭代,“书签”将前进到第一个 产量 语句等,直到函数结束。

    推荐文章