Python3.1 セミナー課題 #13b
《余録》抽象操作:クロージャー版
#! /usr/bin/env python # coding: utf-8 ## ---------------------------------------- ## ## (C) Copyright 2000-2010, 小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部 ## ## ---------------------------------------- # ..+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8 class Collection: species = list def __iter__(self): raise NotImplementedError(self.__class__.__name__) def do(self, f): raise NotImplementedError(self.__class__.__name__) def collect(self, f): s = self.species() self.do(lambda e: s.append(f(e))) return s def select(self, f): s = self.species() def g(f, e): if f(e): s.append(e) self.do(lambda e: g(f, e)) return s def detect(self, f): s = [None] def g(f, e): if f(e): s[0] = e raise Exception try: self.do(lambda e: g(f, e)) except: return s[0] def inject(self, f, v): s = [v] def g(s, f, e): s[0] = f(s[0], e) self.do(lambda e: g(s, f, e)) return s[0]
def strip(e): if not e.isalpha() and e not in ",.\n": return " " else: return e def strip(e): if e.isalpha(): return e if e in ",.\n": return e return " " s = LinkedList(str.split.__doc__) print("".join(s.collect(strip))) print("".join(s.collect(lambda e: (" ",e)[e.isalpha()]))) print("".join(s.collect(lambda e: ((" ",e)[e.isalpha()],e)[e in ",.\n"]))) print("".join(s.select(str.isalpha)))
抽象操作を実現する
class LinkedList(Collection): def do(self, f): for e in self: f(e) def collect(self, f): return [f(e) for e in self] def select(self, f): return [e for e in self if f(e)] def detect(self, f): for e in self: if f(e): return e def inject(self, f, v): s = v for e in self: s = f(s, e) return s
。
def __repr__(self):
s = self.collect(self)
return "%s(%s)"%(self.__class__.__name__,",".join(s))
特殊 __repr__ メソッドは、collect 操作を使って簡潔に表現できます。
》作業中です《
Last updated♪2010/01/19