[問題] 請問generator的send方法

看板Python作者 (我想我瘋了)時間6年前 (2018/01/19 19:23), 編輯推噓2(203)
留言5則, 2人參與, 6年前最新討論串1/1
小弟正在學習PYTHON,看到generator時,下面這支是看得懂... gen.send.preparation.stop.py stop = False def counter(start=0): n = start while not stop: yield n n += 1 c = counter() print(next(c)) # prints: 0 print(next(c)) # prints: 1 stop = True print(next(c)) # raises StopIteration 不過到了下面這支後就卡關了... 我卡關的點在於... 為什麼執行# C步驟時,只有印出0; 而執行# D時卻是印出: <class 'str'> Wow! 1 為什麼不是先印出1呢? 明明result = yield n 就是在前面啊... 如果按照這邏輯的話,步驟# F應該也要先印出3才對... 可是卻先執行# B 印出<class 'str'> Q 後產生StopIteration 麻煩各位大大賜教了,感謝!! gen.send.py def counter(start=0): n = start while True: result = yield n # A print(type(result), result) # B if result == 'Q': break n += 1 c = counter() print(next(c)) # C print(c.send('Wow!')) # D print(next(c)) # E print(c.send('Q')) # F 執行結果: $ python gen.send.py 0 <class 'str'> Wow! 1 <class 'NoneType'> None 2 <class 'str'> Q Traceback (most recent call last): File "gen.send.py", line 14, in <module> print(c.send('Q')) # F StopIteration -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.167.134.103 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1516361025.A.BDF.html

01/19 20:23, 6年前 , 1F
C->A->C(0)->D->A->B(Wow)->A->D(1)->....
01/19 20:23, 1F

01/19 20:28, 6年前 , 2F
another example: https://goo.gl/5VVhSZ
01/19 20:28, 2F

01/19 22:34, 6年前 , 3F
next(g) == g.send(None)
01/19 22:34, 3F

01/19 22:35, 6年前 , 4F
yield 右邊的值會先出來,左值會在下次 send 的時候 assign
01/19 22:35, 4F

01/19 22:37, 6年前 , 5F
& 這個其實是 coroutine 了,見 PEP342
01/19 22:37, 5F
文章代碼(AID): #1QOTL1lV (Python)