python yield
DESCRIPTION
Python の Yield をかじってみた LT駆動開発03TRANSCRIPT
PythonのYieldを かじってみた
@24motz 2014-05-03 LT駆動開発03
Pythonの関数Python 2.7.6 (default, Nov 18 2013, 15:12:51) [GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.2.79)] on darwin Type "help", "copyright", "credits" or "license" for more information. !>>> def a(): ... print "hello" ... >>> a() hello >>> type(a) <type 'function'>
yieldを含む関数>>> def hoge(): ... yield ... >>> type(hoge) <type 'function'> >>> hoge() <generator object hoge at 0x1019fda00> >>> g = hoge() >>> type(g) <type 'generator'> !
yieldを含む関数はイテレータと同じインタフェースを持つ
呼び出し可能オブジェクト (ジェネレーター)を返す
イテレーター>>> def hoge(): ... yield 'a' ... yield 'b' ... >>> g = hoge() >>> print g.next() a >>> print g.next() b >>> print g.next() Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration
シーケンス生成>>> def hoge(): ... yield 'a' ... yield 'b' ... >>> g = hoge() >>> for i in g: ... print i ... a b
sendメソッド>>> def hoge(): ... s = (yield 'a') ... s = (yield s + 'b') ... s = (yield s + 'c') ... >>> g = hoge() >>> print g.send(None) a >>> print g.send('x') xb >>> print g.send('y') yc >>> print g.send('z') Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration
呼出し側からジェネレータに値を渡すことができる
ただし 最初の呼び出しは値を渡せない
!send(None) は next() でも可
最初だけnext()なのは気持ち悪い
状態遷移モデルdef stateManagerGenerator(): while True: ev = (yield State.FIRST) if ev == Event.GOTO_SECOND: break while True: ev = (yield State.SECOND) if ev == Event.GOTO_END: break while True: ev = (yield State.END) !sm = stateManagerGenerator() state = sm.send(None) #=> FIRST state = sm.send(Event.DUMMY) #=> FIRST state = sm.send(Event.GOTO_SECOND) #=> SECOND
受け取ったevに応じて 次の状態に進む 状態遷移の規則を ひとつの関数に まとめられる