我是 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
沒有任何警告或任何類型的錯誤,它只是聳了聳肩繼續執行,這比它不工作更令人驚訝。
這裡發生了什麼?
函數yield
是generators。它們總是產生一個可迭代對象,即使它們中只有一個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] 删除。
我来说两句