Python.use(better) #課題:真理値表《source code》

記事一覧 Python.use(better)《Python3.1》《復刻版》

《余録》課題:真理値表

《著》森こねこ、小粒ちゃん+∞《監修》小泉ひよ子とタマゴ倶楽部
第0版♪2001/03/02 ● 第1版♪2003/05/25 ● 第2版♪2004/06/01 ● 第3版♪2009/02/28

課題を作成する過程を通して「論理演算/文字列処理」の理解を深めます。
※ Python1.5 で作成した例題を、Python3.1 で再構成しました。

課題:ソースコード

#! /usr/bin/env python
# coding: utf-8
## ----------------------------------------
##
## (C) Copyright 2000-2009, 小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部
##
## ----------------------------------------
# ..+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
"""
>>> None

>>> ## ----------------------------------------
>>> None
version: #1.0.32
"""
## ----------------------------------------
def step00():
    """class TruthTable(object):"""

    class TruthTable(object):
        pass

    ## ----------------------------------------
    local = locals()
    ex_TruthTable(local)

## ----------------------------------------
def step01():
    """def __init__(self):"""

    class TruthTable(object):
        def __init__(self):
            self.table = 
        def __repr__(self):
            return "".join(self.table)

    ## ----------------------------------------
    local = locals()
    ex_TruthTable(local)

## ----------------------------------------
def step02():
    """def __iter__(self):"""

    class TruthTable(object):
        def __init__(self):
            self.table = self._table()
        def _table(self):
            s = 
            B = True,False
            for b1 in B:
                for b2 in B:
                    b = b1 and b2
                    s.append(b)
            return s
        def __iter__(self):
            for e in self.table:
                yield "FT"[e]
        def __repr__(self):
            return "".join(self)

    ## ----------------------------------------
    local = locals()
    ex_TruthTable(local)

## ----------------------------------------
def step03():
    """def __repr__(self):"""

    class TruthTable(object):
        def __init__(self):
            self.table = self._table()
        def _table(self):
            B = True,False
            return [b1 and b2
                for b1 in B for b2 in B]
        def __iter__(self):
            for e in self.table:
                yield "FT"[e]
        def __repr__(self):
            s = self._body()
            return "".join(s)
        def _body(self):
            B = "TF"
            s = 
            for i,e in enumerate(self):
                c = "%s %s | %s\n"%(B[i//2], B[i%2], e)
                s.append(c)
            return s

    ## ----------------------------------------
    local = locals()
    ex_TruthTable(local)

## ----------------------------------------
def step04():
    """def _body(self):"""

    class TruthTable(object):
        def __init__(self):
            self.table = self._table()
        def _table(self):
            B = True,False
            return [b1 and b2
                for b1 in B for b2 in B]
        def __iter__(self):
            for e in self.table:
                yield "FT"[e]
        def __repr__(self):
            s = 
            s += self._header()
            s += self._line()
            s += self._body()
            return "".join(s)

        def _body(self):
            B = "TF"
            return ["%s %s | %s\n"%(B[i//2], B[i%2], e)
                for i,e in enumerate(self)]
        def _header(self):
            ss = "p q | p and q\n"
            self.length = len(ss)
            return [ss]
        def _line(self):
            return ["%s\n"%("-"*self.length)]

    ## ----------------------------------------
    local = locals()
    ex_TruthTable(local)

## ----------------------------------------
def step05():
    """def op_and(self):"""

    class TruthTable(object):
        boolean = True,False
        op = "_"

        def __init__(self):
            self.table = 
        def __iter__(self):
            for e in self.table:
                yield "FT"[e]
        def __repr__(self):
            s = [
                self._header(),
                self._line(),
                self._body(),
                ]
            return "".join(s)

        def _body(self):
            B = "TF"
            s = ["%s %s | %s\n"%(B[i//2], B[i%2], e)
                for i,e in enumerate(self)]
            return "".join(s)
        def _header(self):
            ss = "p q | p %s q\n"%self.op
            self.length = len(ss)
            return ss
        def _line(self):
            s ="%s\n"%("-"*self.length)
            return s

        ## ----------------------------------------
        def op_and(self):
            self.op = "and"
            B = self.boolean
            self.table = [b1 and b2
                for b1 in B for b2 in B]
            return self

        def op_or(self):
            self.op = "or"
            B = self.boolean
            self.table = [b1 or b2
                for b1 in B for b2 in B]
            return self

    ## ----------------------------------------
    def ex_TruthTable(local):                   #@:
        source = '''
t = TruthTable(); t
t.op_and()
t.op_or()
'''.split("\n")

        do_it(source, local)
            
    ## ----------------------------------------
    local = locals()
    ex_TruthTable(local)

## ----------------------------------------
def step06():
    """def operator(self, op):"""

    class TruthTable(object):
        boolean = True,False
        op = "_"

        def __init__(self):
            self.table = 
        def __iter__(self):
            for e in self.table:
                yield "FT"[e]
        def __repr__(self):
            s = [
                self._header(),
                self._line(),
                self._body(),
                ]
            return "".join(s)

        def _body(self):
            B = "TF"
            s = ["%s %s | %s\n"%(B[i//2], B[i%2], e)
                for i,e in enumerate(self)]
            return "".join(s)
        def _header(self):
            s = "p %s q"%self.op
            self.width = len(s)
            ss = " p | q | %s\n"%s
            self.length = len(ss)
            return ss
        def _line(self):
            s ="%s\n"%("-"*self.length)
            return s

        ## ----------------------------------------
        def operator(self, op):
            self.title = op
            B = self.boolean
            self.table = [eval("b1 %s b2"%op)
                for b1 in B for b2 in B]
            return self

    ## ----------------------------------------
    local = locals()
    ex_TruthTable1(local)

## ----------------------------------------
def step07():
    """def implication(self):"""

    class TruthTable(object):
        boolean = True,False
        op = "_"

        def __init__(self):
            self.table = []
        def __iter__(self):
            for e in self.table:
                yield "FT"[e]
        def __repr__(self):
            return "".join([
                self._header(),
                self._line(),
                self._body(),
                ])

        def _body(self):
            B = "TF"
            s = [" %s | %s | %s\n"%(B[i//2], B[i%2], e.center(self.width))
                for i,e in enumerate(self)]
            return "".join(s)
        def _header(self):
            s = "p %s q"%self.op
            self.width = len(s)
            ss = " p | q | %s\n"%s
            self.length = len(ss)
            return ss
        def _line(self):
            s ="%s\n"%("-"*self.length)
            return s

        ## ----------------------------------------
        def operator(self, op):
            self.op = op
            B = self.boolean
            self.table = [eval("b1 %s b2"%op)
                for b1 in B for b2 in B]
            return self

        def implication(self):
            self.op = "=>"
            B = self.boolean
            self.table = [not b1 or b2
                for b1 in B for b2 in B]
            return self

    ## ----------------------------------------
    local = locals()
    ex_TruthTable2(local)

## ----------------------------------------
## ----------------------------------------
def ex_TruthTable(local):                   #@:
    source = '''
t = TruthTable(); t
'''.split("\n")

    do_it(source, local)

## ----------------------------------------
def ex_TruthTable1(local):                  #@:
    source = '''
t = TruthTable(); t
t.operator("and")
t.operator("or")
'''.split("\n")

    do_it(source, local)

## ----------------------------------------
def ex_TruthTable2(local):                  #@:
    ex_TruthTable1(local)
    
    source = '''
t.operator("&")
t.operator("|")
t.operator("^")
t.operator("==")
t.operator("!=")
t.implication()
'''.split("\n")

    do_it(source, local)

## ----------------------------------------
## ----------------------------------------
def do_it(source, local):
    for e in source[1:-1]:
        try:
            print_(e, local)
        except AttributeError as error:
            print("AttributeError:", error)
        except TypeError as error:
            print("TypeError:", error)

## ----------------------------------------
def print_(source, local, mode="single"):
    print(">>>",source)
    eval(compile(source,"",mode),globals(),local)

## ========================================
s = "step"
DIR = [e for e in dir() if e.startswith(s)]
DIR = dict((i,e) for i,e in enumerate(DIR))
DIR = list(DIR.items()); DIR.sort()

def ex():
    n = (len(DIR)-1)//10+1
    for k,v in DIR:
        source = '''
x = eval("%%s.__doc__"%%v)
print("%%%dd: %%s -- %%s"%%(k,v,x))
'''%n
        eval(compile(source,"","exec"))

def do_all():
    for k,v in DIR: do(k)

def do(k=None):
    if k is None: ex(); return
    try:
        k,v = DIR[k]
        print(">>> #","-"*50,v)
        eval("%s()"%v)
    except IndexError:
        print("(x_x) too bad ... %s"%k)

## ----------------------------------------
from time import ctime

def time_stamp():
    print("="*24)
    print(ctime())
    print("="*24)

## ----------------------------------------
from doctest import testmod

if __name__=='__main__':
    time_stamp()
    testmod()

## ========================================

TOP


関連記事

Last updated♪2009/12/02