猫史档案馆


【Python作品分享】dttools

用户:庄nnnn额庄nnnn额查看:0 回复:1 评论:0 创建时间:2021-06-27T14:37:12


【作品展示】

center_image

 

【作品介绍】

这里定义了一个无限序列的基类:Infseq,以及两个示范子类:Fibs和Funcrange,还有一个主程序。如果直接点开始会进入一个交互式服务器,也可以当作库来导入。

定义Infseq的子类只需重写俩方法:__init__和get,具体用法看程序吧。

 

【作品源代码】

from math import *
def check(index,delete):
    "Check index to get,set or delete Infseq's value."
    if not isinstance(index,int):
        raise TypeError('Index is not a digit!')
    if index<0:
        raise IndexError('Index is more little than 0!')
    if index in delete:
        raise IndexError('No this index!')
class Infseq:
    """A sequense who don't have the end.
    Subclass only have to rewrite two method:
    __init__ and get.
    Like this:
    class Subinf(Infseq[,Ohterfather1,Otherfather2...]):
        def __init__(self[,otherarg1,otherarg2...]):
            super().__init__(self)
            (other attribute...)
        def get(self,index):
            (how to get value...)
        (other method...)
    You can use function and index grammar to get value.
    like this:
    s=Subinf([,otherarg1,otherarg2...])
    print(s[5])#index
    print(s(5))#function
    You can see Fibs and Funcrange."""#文档字符串
    def __len__(self):#长度
        return inf
    def __init__(self):
        self.changed={}
        self.deleted=[]
    def get(self,index):#直接访问元素
        return 'No set!'
    def __getitem__(self,index):#间接访问元素
        check(index,self.deleted)#检查索引是否合法
        try:
            return self.changed[index]
        except KeyError:
            return self.get(index)
    def __setitem__(self,index,value):#设置元素
        check(index,self.deleted)
        self.changed[index]=value
    def __delitem__(self,index):#删除元素
        check(index,self.deleted)
        self.deleted.append(index)
        self.changed[index]=None
        del self.changed[index]
    def __call__(self,index):#为函数语法访问提供支持
        return self[index]
class Fibs(Infseq):#重写两个方法
    def __init__(self):
        super().__init__()
        self.first=0
        self.last=1
    def get(self,index):
        for i in range(index+1):
            self.first,self.last=self.first+self.last,self.first
        r=self.first
        self.first,self.last=0,1
        return r
class Funcrange(Infseq):
    def __init__(self,funcstr,ch='n'):
        super().__init__()
        self.func=funcstr
        self.ch=ch
    def get(self,index):
        return eval(self.func,{self.ch:index})
def Help():
    print("""make:make a new sequense;
    set:set sequense's item;
    get:get sequense's item;
    del:delete sequense's item;
    quit:quit kingdom;
    ?:print help message.""")
def make():
    name=input("Input sequense's name:")
    e=input('A.Fibs;B.Funcrange:').upper().translate({32:None})
    if e=='B':
        e=input('Input function:')
        return name,Funcrange(e)
    elif e=='A':
        return name,Fibs()
    else:
        raise ValueError('Input A or B!')
def setitem(data):
    name=input("Input sequense's name:")
    e=int(input('Input index:'))
    v=int(input('Input value:'))
    data[name][e]=v
def getitem(data):
    name=input("Input sequense's name:")
    e=int(input('Input index:'))
    return data[name][e]#或:return data[name](e),函数语法访问
def delitem(data):
    name=input("Input sequense's name:")
    e=int(input('Input index:'))
    del data[name][e]
def main():
    data={}
    q=''
    print('Welcome to the sequense kingdom!')
    try:
        while True:
            q=input('Enter command?("?" for help):').lower().translate({32:None})
            if q=='?':
                Help()
            elif q=='make':
                tup=make()
                data[tup[0]]=tup[1]
            elif q=='quit':
                raise OSError('Quit kingdom!')
            elif q=='set':
                setitem(data)
            elif q=='get':
                print('The item is:',getitem(data))
            elif q=='del':
                delitem(data)
            else:
                raise ValueError('No this command!')
    finally:
            print('Bye.')
if __name__=='__main__':
    main()

 

【提示】

部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:

https://python.codemao.cn


回复

上一页1 页 / 共 1下一页
庄nnnn额庄nnnn额

Fibs类的first和last是用来计算的,Funcrange的func属性是函数表达式(不含“y=”),ch是函数未知数的名称(默认“n”)

点赞0


评论