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