[Next] [Previous] [Up] [Top]

やっぱりオブジェクト!

オブジェクト指向プログラミングの例題も挙げておきます。コメントを見ればわかるとおり,順列を生成するライブラリです。ここでは,ライブラリ名(正確にはモジュール名)をpermとしておきます。すると,このライブラリのファイル名は,perm.pyです。

 1: # Permutation generator
 2: #   generate sequence of length n consisted of value 0..(m-1).
 3: #     ex. Permutation(4,3) =>
 4: #           [0,1,2],[0,1,3],[1,0,2],[1,0,3],[2,0,1], .. ,[3,2,0],[3,2,1]
 5: #
 6: #   Permutation(m, n):
 7: #     create a object for mPn.
 8: #   permute():
 9: #     generate a permutation.
10: #     EOFError raised when no more permutations.
11: #
12: class Permutation:
13:     def __init__(self, m, n):
14:         if n > m or n <= 0: raise ValueError
15:         s = _sentinel()
16:         for i in xrange(n):
17:             s = _selection(s)
18:         self.sel = s
19:         self.sel.reset(range(m))
20:
21:     def permute(self):
22:         return self.sel.select()
23:
24: # internal classes
25: class _selection:
26:     def __init__(self, c):
27:         self.avail = []
28:         self.child = c
29:         self.next = 0
30:
31:     def reset(self, a):
32:         self.avail = a
33:         self.next = 0
34:         self.child.reset(self.avail[1:])
35:
36:     def select(self):
37:         s = self.avail[self.next]
38:         try:
39:             ss = self.child.select()
40:         except EOFError:
41:             self.next = self.next + 1
42:             try:
43:                 s = self.avail[self.next]
44:             except IndexError:
45:                 raise EOFError
46:             self.child.reset(self.avail[:self.next] + self.avail[self.next+1:])
47:             ss = self.child.select()
48:         return [s] + ss
49:
50: class _sentinel:
51:     def __init__(self):
52:         self.selected = 0
53: 
54:     def reset(self, a):
55:         self.selected = 0
56:
57:     def select(self):
58:         if self.selected:
59:             raise EOFError
60:         else:
61:             self.selected = 1
62:             return []

このライブラリは,


import perm
 ...
p = perm.Permutation(3, 2)
x = p.permute()
 ...
y = p.permute()
 ...
というふうに使います。正確には,それ以上の順列が存在しない場合にEOFErrorという例外が返りますので,例外を拾ってハンドリングする必要がありますが。

では,プログラムの解説です。さっきより真面目に解説します。


[Next] [Previous] [Up] [Top]