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

【作品介绍】
这里定义了一个无限序列的基类: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