簡體   English   中英

Python下一步並發送相同的生成器

[英]Python next and send in same generator

根據我對yield理解,我寫的這段python表現並不像我期望的那樣。 也許有人可以啟發我。

def printvar():
    yield 3
    data = yield
    print(data)
    data = yield
    print(data)

x = printvar()
print(next(x))
x.send(4)
x.send(5)

我期待的是:

3
4
5

我得到了什么:

3
5

誰能解釋這種行為?

有兩個問題。 一個是通過將發生器推進三次,你只需將它提升到最后的產量,而不是之后的代碼。 另一個是send將其值作為yield語句的值,其中執行先前被暫停,而不是在下一個。 以下是對所發生情況的逐步說明:

  1. 您對next的第一次調用會執行第一次yield 3
  2. 您對send(4)下一次調用會導致yield 3計算為4,但是您在printvar沒有對此進行任何printvar ,因此該值將被丟棄。 .send(4)也將生成器前進到第一個data = yield ,得到None。
  3. 您對.send(5)下一次調用會導致第一個 data = yield將數據設置為5,並將生成器前進到最后一個yield,再次產生None。
  4. 而已。 您不再進一步推進發生器,因此執行在最后一次yield保持停止,從不執行最后一次print

使用send時要記住的事情是它將值發送到已經產生的位置,而不是它接下來要產生的位置。 有關更多說明,請參閱此類似問題

嘗試這個:

def printvar():
    data = yield 3
    print(data)
    data = yield
    print(data)

x = printvar()
print(next(x))
x.send(4)
x.send(5)

在你的原始代碼中,send(4)無處可去,因為yield語句沒有收集任何東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM