Pythonのお勉強 Part15
■ このスレッドは過去ログ倉庫に格納されています
0494デフォルトの名無しさん
2006/11/29(水) 13:41:43... while 1:
... val = (yield 10)
>>> __import__('dis').dis(mygen)
2 0 SETUP_LOOP 10 (to 13)
3 >> 3 LOAD_CONST 1 (10)
6 YIELD_VALUE
7 STORE_FAST 0 (val)
10 JUMP_ABSOLUTE 3
>> 13 LOAD_CONST 0 (None)
16 RETURN_VALUE
(参考: ttp://www.python.jp/doc/2.4/lib/bytecodes.html)
直前のnext()やsend()が値を返した直後はYIELD_VALUEまで実行されている。
send(arg)を呼ぶとargをTOSに積んでSTORE_FAST以降を実行。
だからval=argになって次のYIELD_VALUEまで進んで値を返す...ということじゃないかな。
next()を呼んだときはTOSにNoneを積むから、next()はsend(None)と等価だと思う。
>>> def mygen2():
... while 1:
... yield 10
2 0 SETUP_LOOP 8 (to 11)
3 >> 3 LOAD_CONST 1 (10)
6 YIELD_VALUE
7 POP_TOP
8 JUMP_ABSOLUTE 3
とにかく2.5ではnext()を呼ぶとTOSに何かを積むらしい。2.4ではYIELDの前後はこうだった。
3 >> 3 LOAD_CONST 2 (10)
6 YIELD_VALUE
7 JUMP_ABSOLUTE 3
■ このスレッドは過去ログ倉庫に格納されています