だいたいこのような流れで処理が行われていると考えてみてください。
send()が呼び出される前は、yieldで再開待ち
↓
send(10)により、stepに10が代入される(step = yield valのところ)
↓
whileループの先頭に戻り val = val + step が評価される (val=13)
↓
yieldにより、呼び出し元に 13 が返され、再びyieldで再開待ち
...
ただ、元のコードでは、stepがどのように作用しているかが分かりにくいと思いました。
このように書き換えてみると、gen()
、g.__next__()
、g.send(x)
が呼ばれたときにどのように動作しているかが分かりやすくなると思います。
lang
1# -*- coding: utf-8 -*-
2
3def gen(init_val):
4 print("init_val=", init_val)
5 val = init_val
6 step = 0
7 while True:
8 print("val=", val)
9 print("step=", step)
10 val = val + step
11 step = yield val
12
13print("---gen(3)呼び出し---")
14g = gen(3)
15
16print("---g.__next__()呼び出し---")
17print( g.__next__() )
18print("---")
19
20print("---g.send(10)呼び出し---")
21print( g.send(10) )
22print("---")
23
24print("---g.send(5)呼び出し---")
25print( g.send(5) )
26print("---")
---gen(3)呼び出し---
---g.__next__()呼び出し---
init_val= 3
val= 3
step= 0
3
---
---g.send(10)呼び出し---
val= 3
step= 10
13
---
---g.send(5)呼び出し---
val= 13
step= 5
18
---
...
参考リンク:
ジェネレータの使い方 - Qiita
http://qiita.com/Kodaira_/items/32b1ef860f59df80eedb