Python yield
-
Upload
takuya-nishimoto -
Category
Technology
-
view
2.265 -
download
8
description
Transcript of Python yield
![Page 1: Python yield](https://reader036.fdocument.pub/reader036/viewer/2022083000/55660baad8b42aa6628b511f/html5/thumbnails/1.jpg)
PythonのYieldを かじってみた
@24motz 2014-05-03 LT駆動開発03
![Page 2: Python yield](https://reader036.fdocument.pub/reader036/viewer/2022083000/55660baad8b42aa6628b511f/html5/thumbnails/2.jpg)
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'>
![Page 3: Python yield](https://reader036.fdocument.pub/reader036/viewer/2022083000/55660baad8b42aa6628b511f/html5/thumbnails/3.jpg)
yieldを含む関数>>> def hoge(): ... yield ... >>> type(hoge) <type 'function'> >>> hoge() <generator object hoge at 0x1019fda00> >>> g = hoge() >>> type(g) <type 'generator'> !
yieldを含む関数はイテレータと同じインタフェースを持つ
呼び出し可能オブジェクト (ジェネレーター)を返す
![Page 4: Python yield](https://reader036.fdocument.pub/reader036/viewer/2022083000/55660baad8b42aa6628b511f/html5/thumbnails/4.jpg)
イテレーター>>> 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
![Page 5: Python yield](https://reader036.fdocument.pub/reader036/viewer/2022083000/55660baad8b42aa6628b511f/html5/thumbnails/5.jpg)
シーケンス生成>>> def hoge(): ... yield 'a' ... yield 'b' ... >>> g = hoge() >>> for i in g: ... print i ... a b
![Page 6: Python yield](https://reader036.fdocument.pub/reader036/viewer/2022083000/55660baad8b42aa6628b511f/html5/thumbnails/6.jpg)
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()なのは気持ち悪い
![Page 7: Python yield](https://reader036.fdocument.pub/reader036/viewer/2022083000/55660baad8b42aa6628b511f/html5/thumbnails/7.jpg)
状態遷移モデル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に応じて 次の状態に進む 状態遷移の規則を ひとつの関数に まとめられる