« デンシンボウと音声認識 | トップページ | Go言語のgoroutine間の同期(4) »

Pythonのyield文

Pythonは、リスト内包式(list comprehension expressions)を使ってリストを生成することができる。

しかし、生成したリストの要素の最初のほうだけを使って、後は使わない場合があるプログラムを考えると、一度に全て計算してしまうのは無駄だ。計算コストとメモリ領域の無駄がある。

できれば、必要になった時に、必要な分だけ計算したい。

こういう計算方法を遅延評価と言うが、Pythonには遅延評価を行う仕組みが用意されている。ジェネレータ式(generator expressions)がそれだ。

ジェネレータ式はこう書く。

>>> squares = (x ** 2 for x in range(5))

ジェネレータ式が生成するリスト要素は、イテレータ(上の場合はsquares)のnextメソッドが呼ばれる度に計算される。

>>> squares.next()
0
>>> squares.next()
1

このように、ジェネレータ式を使うことで、計算コストとメモリ領域の無駄をなくすことができる。

Pythonにはさらに、内部にループを持つ関数をジェネレータ化する仕組みが用意されている。yield文がそれだ。

次のように使う。

>>> def generateSquares(N):
...     for i in range(N):
...         yield i ** 2
...
>>> G = generateSquares(5)
>>> list(G)
[0, 1, 4, 9, 16]

ここでGはイテレータなので、次のようにも使える。

>>> G = generateSquares(5)
>>> G.next()
0
>>> G.next()
1
>>> G.next()
4
>>> G.next()
9
>>> G.next()
16

このようにyield文でジェネレータ化した関数は、yield文を実行した後で関数の状態を保存して一時停止し、次のイテレーション(next()が呼ばれた時)で、関数を前の状態に戻して、yield文の次から処理を再開する。

yieldを使う、この遅延評価の仕組みは、PythonのシミュレーションライブラリであるSimPyにおいて、モデルを記述するのに使われている。

★WOZ★

にほんブログ村 IT技術ブログ 開発言語へ
にほんブログ村

Python: Pocket Reference (Python in Your Pocket) Book Python: Pocket Reference (Python in Your Pocket)

著者:Mark Lutz
販売元:Oreilly & Associates Inc
Amazon.co.jpで詳細を確認する

初めてのPython 第3版 Book 初めてのPython 第3版

著者:Mark Lutz
販売元:オライリージャパン
Amazon.co.jpで詳細を確認する

初めてのPython第3版 初めてのPython第3版

販売元:楽天ブックス
楽天市場で詳細を確認する


|

« デンシンボウと音声認識 | トップページ | Go言語のgoroutine間の同期(4) »

Python」カテゴリの記事

コメント

とても参考になりました。

投稿: | 2011年5月 5日 (木) 11時49分

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1286769/32622371

この記事へのトラックバック一覧です: Pythonのyield文:

« デンシンボウと音声認識 | トップページ | Go言語のgoroutine間の同期(4) »