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