君ならどうする – ls-lRシェル Python編 Template Method Composite cmd.Cmd Iterator LsShell Directory LSLoader Builder File PredBuilder Interpreter cmd.Cmd Python標準モジュール。シェルのような対話型アプリケーション用のフレームワーク。 LsLoader ls –lRの出力を読み込み、Directory/Fileオブジェクトを構築する。 LsShell cmd.Cmdを基底クラスとしたls-lRシェルの本体。 Directory ディレクトリ情報を保持する。 PredBuilder 検索コマンドの検索条件をコンパイルし、Pythonの関数オブジェクトを生成する。 File ファイル情報を保持する。 LL Weekend 君ならどうする ls-lRシェル Python編 2004/8/7 Atsuo Ishimoto 1/2
PythonのIteratorオブジェクト Generator関数 次の値を返すnext()メソッドを持つ next()で返すオブジェクトがなければ、StopIteration例外を送出する __iter__()メソッドを持ち、自分自身を返す class AlterIter: '''seq1, seq2内の要素を交互に返すイテレータ''' def __init__(self, seq1, seq2): self._seqs = (seq1, seq2) self._cur = 0 self._max = min(len(seq1), len(seq2)) def __iter__(self): return self def next(self): n, idx = self._cur % 2, self._cur//2 if idx >= self._max: raise StopIteration ret = self._seqs[n][idx] self._cur += 1 return ret for v in AlterIter([1,2],['a','b']): print v, 出力 => 1 a 2 b Generator関数 定義内にyield文を含む関数 呼び出されると Iteratorの一種であるgeneratorオブジェクトを返す generatorのnext()メソッドを呼び出すと、関数のyield文までを実行してその値を返す yield文に遭遇せずに関数が終了すると、StopIteration例外を送出する def fibonacci(): i = j = 1 yield i yield j while True: i, j = j, i+j for n in fibonacci(): print n, 出力 => 1 1 2 3 5 8 13 21 34 55 89 ... def AlterIter(seq1, seq2): _max = min(len(seq1), len(seq2)) for idx in range(_max): yield seq1[idx] yield seq2[idx] LL Weekend 君ならどうする ls-lRシェル Python編 2004/8/7 Atsuo Ishimoto 2/2