バリケンのPython日記 RSSフィード

2008-10-28

[] イテレータとジェネレータ(2)  イテレータとジェネレータ(2) - バリケンのPython日記 を含むブックマーク はてなブックマーク -  イテレータとジェネレータ(2) - バリケンのPython日記  イテレータとジェネレータ(2) - バリケンのPython日記 のブックマークコメント

この間の続きだよ。

この間は「ジェネレータ」について挙動を調べてみたけど、今回は「イテレータ」についての挙動を調べてみるよ。

またいきなり天下りな感じだけど、iter()という関数があるみたいだよ。この関数は、引数オブジェクトに対して__iter__()メソッドを呼んで、その戻り値を返すみたい。だから、

iter([1,2,3,4,5])

と、

[1,2,3,4,5].__iter__()

は同じことみたいだよ。ちょっと実験してみよう!

>>> iter([1,2,3,4,5])
<listiterator object at 0x00C38A10>
>>> 

おや、「リストイテレータオブジェクト」というものが返ってきているね。じゃあ、前回同様変数に代入して、色々と調べてみよう!

>>> i = iter([1,2,3,4,5])
>>> dir(i)
['__class__', '__delattr__', '__doc__', '__getattribute__', '__hash__', '__init_
_', '__iter__', '__length_hint__', '__new__', '__reduce__', '__reduce_ex__', '__
repr__', '__setattr__', '__str__', 'next']
>>> i.next()
1
>>> i.next()
2
>>> i.next()
3
>>> i.next()
4
>>> i.next()
5
>>> i.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>>

どうやら、このオブジェクトはnext()メソッドを呼ぶたびに生成元のリストの要素を一つずつ返すみたいだね。

あと、次の要素がもうない状態でnext()メソッドを実行すると、StopIterationという例外が発生するみたいだよ。前回の「ジェネレータ」に挙動は良く似ているね。

トラックバック - http://python.g.hatena.ne.jp/muscovyduck/20081028