Python3.1 セミナー課題 #13a
《余録》抽象操作:内包版
#! /usr/bin/env python # coding: utf-8 ## ---------------------------------------- ## ## (C) Copyright 2000-2010, 小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部 ## ## ---------------------------------------- # ..+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8 class Collection: species = list def do(self, f): for e in self: f(e) def collect(self, f): s = [f(e) for e in self] return self.spawn(s) def select(self, f): s = [e for e in self if f(e)] return self.spawn(s) def detect(self, f): for e in self: if f(e): return e else: return None def detect(self, f, g=lambda e:None): for e in self: if f(e): return e else: return g(e) def inject(self, acc, f): for e in self: acc = f(acc, e) else: return acc
抽象操作を実現する
class mystr(Collection, str): """ >>> c = mystr("ABCDE") >>> type(c)>>> s = c.do(lambda e: print(e,end=", ")); s A, B, C, D, E, >>> s = c.collect(lambda e: str.lower(e)); s 'abcde' >>> s = c.select(lambda e: ord(e)%2); s 'ACE' >>> s = c.detect(lambda e: not ord(e)%2); s 'B' >>> s = c.detect(lambda e: e.islower(), lambda e: ""); s '' >>> s = c.detect(lambda e: e.islower()); s None >>> s = c.inject("", lambda acc,e: e.lower()+acc); s 'edcba' """ def spawn(self, s): return "".join(s) class mylist(Collection, list): """ >>> c = mylist("ABCDE") >>> type(c) >>> s = c.do(lambda e: print(e,end=", ")); s A, B, C, D, E, >>> s = c.collect(lambda e: str.lower(e)); s ['a', 'b', 'c', 'd', 'e'] >>> s = c.select(lambda e: ord(e)%2); s ['A', 'C', 'E'] >>> s = c.detect(lambda e: not ord(e)%2); s 'B' >>> s = c.inject("", lambda acc,e: e.lower()+acc); s 'edcba' """ def spawn(self, s): return s class mytuple(Collection, tuple): """ >>> c = mytuple("ABCDE") >>> type(c) >>> s = c.do(lambda e: print(e,end=", ")); s A, B, C, D, E, >>> s = c.collect(lambda e: str.lower(e)); s ('a', 'b', 'c', 'd', 'e') >>> s = c.select(lambda e: ord(e)%2); s ('A', 'C', 'E') >>> s = c.detect(lambda e: not ord(e)%2); s 'B' >>> s = c.inject("", lambda acc,e: e.lower()+acc); s 'edcba' """ def spawn(self, s): return tuple(s) class myset(Collection, set): """ >>> c = myset("ABCDECCD") >>> type(c) >>> s = c.do(lambda e: print(e,end=", ")); s A, C, B, E, D, >>> s = c.collect(lambda e: str.lower(e)); s {'a', 'c', 'b', 'e', 'd'} >>> s = c.select(lambda e: ord(e)%2); s {'A', 'C', 'E'} >>> s = c.detect(lambda e: not ord(e)%2); s 'B' >>> s = c.inject("", lambda acc,e: e.lower()+acc); s 'debca' """ def spawn(self, s): return set(s) class mydict(Collection, dict): """ >>> c = mydict({e:ord(e) for e in "ABCDE"}) >>> type(c) >>> s = c.do(lambda e: print(e,end=", ")); s 65, 67, 66, 69, 68, >>> s = c.collect(lambda e: str(e)); s ['65', '67', '66', '69', '68'] >>> s = c.select(lambda e: e%2); s [65, 67, 69] >>> s = c.detect(lambda e: not e%2); s 66 >>> s = c.inject("", lambda acc,e: chr(e)+acc); s 'DEBCA' """ def __iter__(self): # do: for e in self.values(): yield e def spawn(self, s): return s class mybag(Collection): """ >>> c = mybag("ABCDECCE") >>> type(c) >>> s = c.do(lambda e: print(e,end=", ")); s A, C, C, C, B, E, E, D, >>> s = c.collect(lambda e: str.lower(e)); s {'a', 'c', 'c', 'c', 'b', 'e', 'e', 'd'} >>> s = c.select(lambda e: ord(e)%2); s {'A', 'C', 'C', 'C', 'E', 'E'} >>> s = c.detect(lambda e: not ord(e)%2); s 'B' >>> s = c.inject("", lambda acc,e: acc+e); s 'ACCCBEED' """ def __init__(self, items): self.items = {} for e in items: self.items[e] = self.items.get(e,0)+1 def __iter__(self): # do: for k,v in self.items.items(): for e in range(v): yield k def __repr__(self): s = [repr(e) for e in self] return "{%s}"%(", ".join(s)) def spawn(self, s): s = {e:self.items[e] for e in s if e in self.items} return s def spawn(self, s): return mybag(s) ## ======================================== from time import ctime def time_stamp(): print("="*24) print(ctime()) print("="*24) ## ---------------------------------------- from doctest import testmod if __name__=='__main__': time_stamp() testmod() ## ========================================
》作業中です《
Last updated♪2010/01/19