Symfoware

Symfowareについての考察blog

Python イテレータ型を作成し、forやinが使えるオブジェクトを作成する

Pythonのドキュメントを読んでいると、「イテレーター型」を見つけました。
5.5. イテレータ型

使い方を調べてみます。


簡単なサンプル



__iter__を実装するだけで、イテレーター型になります。
forの他に、inも使用できます。


  1. # -*- coding:utf-8 -*-
  2. class T(object):
  3.     
  4.     def __init__(self):
  5.         self.values = range(10)
  6.     
  7.     def __iter__(self):
  8.         for value in self.values:
  9.             yield values
  10. def main():
  11.     
  12.     t = T()
  13.     
  14.     for item in t:
  15.         print item
  16.     
  17.     
  18.     print '-' * 10
  19.     
  20.     print 5 in t
  21.     print 15 in t
  22.     
  23. if __name__ == '__main__':
  24.     main()





$ python sample.py
0
1
2
3
4
5
6
7
8
9
----------
True
False




ドキュメントを見ると、nextの実装も必要そうでしたが、
__iter__の実装だけで良いようです。





nextの実装



nextを実装したい場合は、こんな感じになります。


  1. # -*- coding:utf-8 -*-
  2. class T(object):
  3.     
  4.     def __init__(self):
  5.         self.values = range(10)
  6.     
  7.     def __iter__(self):
  8.         self.count = -1
  9.         return self
  10.     def next(self):
  11.         
  12.         self.count += 1
  13.         if self.count >= 10:
  14.             raise StopIteration
  15.         
  16.         return self.values[self.count]
  17.         
  18.         
  19. def main():
  20.     
  21.     t = T()
  22.     
  23.     for item in t:
  24.         print item
  25.     
  26.     
  27.     print '-' * 10
  28.     
  29.     print 5 in t
  30.     print 15 in t
  31.     
  32. if __name__ == '__main__':
  33.     main()





$ python sample.py
0
1
2
3
4
5
6
7
8
9
----------
True
False





注意するポイントとしては、inやforが実行される前に、
__iter__の呼び出しが行われます。
ここで初期化を行っていないと、おかしな実行結果になります。

このようなプログラムに変更した場合、


  1. # -*- coding:utf-8 -*-
  2. class T(object):
  3.     
  4.     def __init__(self):
  5.         self.values = range(10)
  6.         self.count = -1
  7.     
  8.     def __iter__(self):
  9.         return self
  10.     def next(self):
  11.         
  12.         self.count += 1
  13.         if self.count >= 10:
  14.             raise StopIteration
  15.         
  16.         return self.values[self.count]
  17.         
  18.         
  19. def main():
  20.     
  21.     t = T()
  22.     
  23.     for item in t:
  24.         print item
  25.     
  26.     
  27.     print '-' * 10
  28.     
  29.     print 5 in t
  30.     print 15 in t
  31.     
  32. if __name__ == '__main__':
  33.     main()




inでの問い合わせ結果が誤ったものになります。


$ python sample.py
0
1
2
3
4
5
6
7
8
9
----------
False
False




関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2015/06/21(日) 12:56:58|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Python 件数のカウントにCounterオブジェクトを使用する | ホーム | Pythonから係り受け解析機「CaboCha」を使用する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1731-98316362
この記事にトラックバックする(FC2ブログユーザー)