spam対策のため、http://〜 を含む投稿は禁止されています。 URLを投稿する場合、"http://" を省略するなどしてください。

管理人ToDo: 2011年6月30日OTD BBS終了だそうなので、それまでに対応策を考える。


Title
(4桁の数字)

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


番を鍵


livedoor レンタル掲示板 OTD