為什麼 Python 的 yield 語句不能在一個函數中調用,也不能在它調用的另一個函數中調用,為什麼在嘗試時沒有報告錯誤?

阿德里安

我是 Python 新手,我發現該yield語句非常有用。然而,有些讓我吃驚。將多個yield語句放在一個函數中會導致每個語句都出現在一個for var in fn()循環中。但是,如果我從使用該yield語句的初始函數執行另一個函數,則不會執行該函數。我剛剛採取了天真的方法,只是認為它會奏效。

例如

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

沒有任何警告或任何類型的錯誤,它只是聳了聳肩繼續執行,這比它不工作更令人驚訝。

這裡發生了什麼?

托馬拉克

函數yieldgenerators它們總是產生一個可迭代對象,即使它們中只有一個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一旦您真正開始迭代,“書籤”將前進到第一條yield語句,依此類推,直到函數結束。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章