看板 Python 關於我們 聯絡資訊
小弟正在學習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
seLain: C->A->C(0)->D->A->B(Wow)->A->D(1)->.... 01/19 20:23
seLain: another example: https://goo.gl/5VVhSZ 01/19 20:28
zerof: next(g) == g.send(None) 01/19 22:34
zerof: yield 右邊的值會先出來,左值會在下次 send 的時候 assign 01/19 22:35
zerof: & 這個其實是 coroutine 了,見 PEP342 01/19 22:37