for と別れる50の方法《03》イテレーター
Python.use(better) # OOP への道 《Python3.1, Jython2.5.0, IronPython2.6.x》
イテレーター
《著》真樹育未・後藤いるか・小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部
第0版♪1988/10/12 ● 第1版♪1993/05/23 ● 第2版♪2003/05/25
■ 概要
for 文はいくつかの問題を抱え、OOP を実践するときの「障害」になります。
伝統的なC言語風の for 文や悪名高い switch 文、配列の呪縛から解かれ、オブジェクト指向プログラミング〔OOP〕の醍醐味を堪能するための準備を行います。
■ 関連記事
- Java プログラマーのための Python 導入ガイド
- 例題で学ぶ Jython/Swing デザインパターン《Jython2.5》改訂版
- ゲームに学ぶ Jython/Swing フレームワーク《Jython2.5》改訂版
- IronPython で学ぶ WPF プログラミングの世界《IronPython2.6》改訂版
何が問題か
OOP の「障害」になる for 文の問題点を明らかにするために、K&R を離れて、別の事例を紹介します。
《Note》Python にも for 文はあります。しかし、これはC言語風の for 文とは「異質」のものです。C言語における while/for の違いを同義語とするなら、Python の for は、同音異義語(似て非なるもの)のようなものです。
イテレーターを導入する
■ 伝統的な for と似て非なる for 文:Python 流の解法
def ex5(): s = ["AB", "C", "DEF"] s = LinkedList(s) for e in s: # (@.@) Keep your eyes! print(e) print(s)
前述した 事例 ex3 と比較してください。変数によって参照されるオブジェクトが、文字列(組み込み型 str)か連結リスト(クラス LinkedList)かの違いに依らず、同じコードの断片になるのが分かります。次のような出力が得られます。
>>> ex5() AB C DEF LinkedList(A,BC,DEF)
イテレーターの効用
イテレーターの効用は、制御構造 for..in だけではありません。iterable が期待される場所ならどこでも、イテレーターの恩恵に浴することができます。
■ 制御構造 for..in
>>> s = LinkedList("ABC"); s
LinkedList(A,B,C)
>>> for e in s: print(e)
...
A
B
C
■ 組み込み演算子
TrueFalse■ 組み込み型のメソッド
>>> ",".join(s) 'A,B,C'■ 内包(リスト/辞書)
['a', 'c']{'A': 65, 'C': 67, 'B': 66} >>>■ ジェネレーター式
>>> list(ord(e) for e in s) [65, 66, 67] >>> list(e for e in s if ord(e)%2) ['A', 'C'] >>> dict((e,ord(e)) for e in s) {'A': 65, 'C': 67, 'B': 66}■ 組み込み関数
>>> map(str.lower, s); list(_) <map object at 0xed930> ['a', 'b', 'c'] >>> filter(lambda e: ord(e)%2, s); list(_) <filter object at 0xed970> ['A', 'C']Tips:
》作業中です《Last updated♪2009/07/05