PowerPoint プレゼンテーション

君ならどうする – 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