君ならどうする – ls-lRシェル Python編 Template Method Composite cmd.Cmd Iterator LsShell PredBuilder Directory LSLoader Builder File Interpreter cmd.Cmd LsLoader LsShell Directory Python標準モジュール。シェルのような対話型アプリ ケーション用のフレームワーク。 ls –lRの出力を読み込み、Directory/Fileオブジェクト を構築する。 cmd.Cmdを基底クラスとしたls-lRシェルの本体。 ディレクトリ情報を保持する。 PredBuilder File 検索コマンドの検索条件をコンパイルし、Pythonの関 数オブジェクトを生成する。 ファイル情報を保持する。 LL Weekend 君ならどうする ls-lRシェル Python編 2004/8/7 Atsuo Ishimoto 1/2 PythonのIteratorオブジェクト Generator関数 •次の値を返すnext()メソッドを持つ •next()で返すオブジェクトがなければ、StopIteration例外を送 出する •__iter__()メソッドを持ち、自分自身を返す •定義内にyield文を含む関数 •呼び出されると Iteratorの一種であるgeneratorオブジェクトを返 す •generatorのnext()メソッドを呼び出すと、関数のyield文までを実 行してその値を返す •yield文に遭遇せずに関数が終了すると、StopIteration例外を送 出する 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 def fibonacci(): i=j=1 yield i yield j while True: i, j = j, i+j yield 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
© Copyright 2024 ExpyDoc