ジェネレータ

yield

関数やメソッドなどcallable objectの定義内にyieldが含まれる場合 それらはジェネレータとして解釈されます。

普通の使い方:

def generator():
    for ii in range(10):
        yield ii

for ii in generator():
    print ii

上のコードでは次のコードと同じ動作をします。:

for ii in xrange(10):
    print ii

要はxrange()みたいなことができるという事です。

コルーチン的な使い方

あまり奇麗な使い方ではないけど 処理をさせたり止めたりをさせたいような状況に追い込まれる事があります。 下記ではrange(5)の値を回し続け次の要素と送られてきた要素を足して返す処理を実装しています。 (例としてはよくないかも知れませんが..) classを定義して行う事が正しいとは思いますが それすら面倒に感じるときもあるのでそういう場合に対応できます。

import itertools
def generator():
    elements = range(5)
    num = None
    for element in itertools.cycle(elements):
        num = yield num
        num += element
iterator = generator()
iterator.next()
print iterator.send(0)
print iterator.send(0)
print iterator.send(0)
print iterator.send(0)
print iterator.send(0)
print iterator.send(0)
print iterator.send(0)
print iterator.send(0)
print iterator.send(0)
print iterator.send(0)
print iterator.send(0)

ノート

iterator.next() で1つ目を捨てているのに注意してください。 上記例では最初にyieldに到達するときにnumに入っているのは初期値のNoneです。 不要なので最初の要素を捨てています。

目次

このページ

inserted by FC2 system