spam対策のため、http://〜 を含む投稿は禁止されています。 URLを投稿する場合、"http://" を省略するなどしてください。
管理人ToDo: 2011年6月30日にOTD BBS終了だそうなので、それまでに対応策を考える。
4898 KT Iterator on Python 2004/08/10 11:57
こんにちは。 PythonのIteratorについて、全然知らないでのは寂しいので、私の知って いる範疇でざっと解説したいと思います。多少なりとも参考になれば幸いです。 最近のPythonはリストやファイルから簡単にイテレータが作れます。 i = iter( リスト ) とかするだけ。i.next() で次の値ゲット。 これ以上要素がないときにはStopIteration例外発動。 で、外部イテレータとして、whileループで回してtryで例外捕まえて、 とも書けますが、普通もっと楽な方法を使います:forにつっこむだけ。 for i in iter( リスト ): print i これでnext()とかStopIterationとかは書かなくても言語が面倒見てくれます。 内部イテレータなのか外部イテレータなのか微妙なところです(笑 もちろんイテレータを自分で作ることも出来ます。 既存のオブジェクトからイテレータを作るのは、nextメソッドと、いくつかの おやくそくを実装したクラスを作ること。これは他言語でも同様ですね。 もうひとつ、値を生成して返すイテレータ(ジェネレータと言います) というものがあります。作りかたはこう。 def fibgen(): a, b = 1, 1 while True: yield a yield b a, b = b, a + b yieldを使うのはC#に似ています……というかPythonの方が先発です。 あまりの便利さにMSがパクったに違いない(笑 すばらしい(笑 fibgen()はジェネレータオブジェクトを返します。使い方はイテレータと同じ。 for i in fibgen(): print i 逐次計算なのでメモリも喰いませんし状態管理も楽です。しかも無限列の扱いも楽々。 難点は、ここ2〜3年で言語仕様に入ったばかりなので、 これを知っている人が、Pythonを知っている人より更に少ないこと(笑 タイムリーにも、先日のLightweight Language Weekendでの 発表資料がアップされてるので、そちらも参照して下さい。 http://www.python.jp/Zope/articles/tips/iterator.ppt |