Python用类实现串以及对串的方法进行单元测试
串是一种常见的数据结构,这里使用Python定义类来实现相应的方法。先看代码,再对相关知识进行讲解。
# coding=utf-8 __all__=['ADTString'] class ADTString(object): ''' 此类用于描述串,包含以下方法 ''' def __init__(self, d=''): ''' data用于存储串 ''' self.data = d def StrCopy(self): ''' 复制函数,返回主串data ''' return self.data def ClearString(self): ''' 清空主串 ''' self.data = '' def StringEmpty(self): ''' 判断主串是否为空,返回True或False ''' return False if len(self.data) else True def StrLength(self): ''' 返回主串的长度 ''' return len(self.data) def StrCompare(self, T): ''' 主串和串T进行比较,大于串T返回1,等于串T返回0,小于串T返回-1 ''' len_S = self.StrLength() len_T = T.StrLength() len_min = min(len_S, len_T) len_max = max(len_S, len_T) i=j=0 while(True): if (i>=len_min): if len_min==len_max: return 0 elif (j >=len_min): return 1 if len_S > len_T else -1 if(self.data[i]==T.data[j]): i=i+1 j=j+1 elif self.data[i]<T.data[j]: return -1 elif self.data[i]>T.data[j]: return 1 def Concat(self, S2): ''' 拼接主串和串S2 ''' return self.data+S2.data def SubString(self, pos, len_): ''' 返回主串中,第pos个字符后len_长的子串 pos为负数,则逆序 ''' if pos >= 0: if len(self.data) < pos: return -1 return self.data[pos:pos+len_] else: if len_==0 or pos==-1: return '' elif pos+len_==0 or abs(pos)<len_: return self.data[pos:-1]+self.data[-1] else: return self.data[pos:pos+len_] def Index(self, T, pos): ''' 若主串S中存在和串T值相同的子串,则返回它在主串中第pos个字符之后第一次出现的位置,否则返回-1 ''' len_T = T.StrLength() len_S = self.StrLength() if len_S < len_T + pos: return -1 p1 = pos p2 = pos + len_T while(p2<=len_S): if self.SubString(p1, len_T) == T.data: return p1 else: p1=p1+1 p2=p2+1 if p2 > len_S: return -1 def IndexBruteforce(self, T, pos): ''' 朴素匹配算法,若主串S中存在和串T值相同的子串,则返回它在主串中第pos个字符之后第一次出现的位置,否则返回-1;不使用串定义的方法来实现 ''' len_T = T.StrLength() len_S = self.StrLength() i=pos j=0 while(True): if i >= len_S or j >= len_T: break if(self.data[i]==T.data[j]): i=i+1 j=j+1 else: i=i-j+1 j=0 return i-j if j>=len_T else -1 def GetNext(self): ''' 返回KMP匹配算法所需的next数组 ''' len_S=self.StrLength() next=[0] i=1 while(True): if i>=len_S: break k = next[i-1] while(self.data[k]!=self.data[i] and k!=0): k=next[k-1] if self.data[k]==self.data[i]: next.append(k+1) else: next.append(0) i=i+1 return next def IndexKMP(self, T, pos): ''' KMP匹配算法,若主串S中存在和串T值相同的子串,则返回它在主串中第pos个字符之后第一次出现的位置,否则返回-1;不使用串定义的方法来实现 ''' next=self.GetNext() len_T = T.StrLength() len_S = self.StrLength() i=pos j=0 while(True): if i >= len_S or j >= len_T: break if(self.data[i]==T.data[j]): i=i+1 j=j+1 else: i=i+next[i]+1 j=0 return i-j if j>=len_T else -1 def Replace(self, T, V): ''' 用串V替换主串S中,出现的所有与串T相等的不重叠的子串 ''' string = '' len_S = len(self.data) len_T = len(T.data) p1=p2=0 while(True): pos = self.Index(T, p2) if pos == -1: string+=self.data[p2:] break else: p1=pos string+=self.data[p2:p1] string+= V.data p2=p1+len_T if string == '': return self.data else: return string def StrInsert(self, pos, T): ''' 在主串的第pos个字符后,插入串T;pos为负,则逆序插入 ''' len_S = len(self.data) if len_S < pos or len_S <abs(pos): return -1 return self.data[:pos]+T.data+self.data[pos:] def StrDelete(self, pos, len_): ''' 在主串的第pos个字符后,删除len_长度的字符 pos小于0则逆序删除 ''' len_S = len(self.data) if pos >= 0: if len_S < pos: return -1 return self.data[:pos]+self.data[pos+len_:] else: if len_S < abs(pos) : return -1 return self.data[:pos-len_]+self.data[pos:] if __name__ == '__main__': from ADTString import ADTString # 打印该类的readme文档 print help(ADTString)
第3行:__all__中定义的内容,是使用from <module> import * 时,会导出的内容。
第15~218行:串的一些基本方法,其中,第86~105行的Index,是使用到串SubString方法来实现的;第107~125行,是使用朴素匹配算法实现的;第149~167行,是使用KMP匹配算法来实现的。
第223行:是打印根据代码和注释,自动生成的参考文档。
下面对这个类进行单元测试,使用unittest模块,代码的最后两行,是执行单元测试的意思。
# conding=utf-8 from ADTString import ADTString import unittest class TestADTStringMethods(unittest.TestCase): def setUp(self): self.obj = ADTString() def tearDown(self): pass def test_StrCopy(self): self.obj.data='' self.assertEqual(self.obj.StrCopy(), '') self.obj.data='goodgoogle' self.assertEqual(self.obj.StrCopy(), 'goodgoogle') self.obj.data='!' self.assertEqual(self.obj.StrCopy(), '!') def test_ClearString(self): self.obj.data='goodgoogle' self.obj.ClearString() self.assertEqual(self.obj.data, '') def test_StringEmpty(self): self.obj.data='' self.assertEqual(self.obj.data, '') def test_StrLength(self): self.obj.data=' self.assertEqual(self.obj.StrLength(), 3) self.obj.data='' self.assertEqual(self.obj.StrLength(), 0) def test_StrCompare(self): obj_T=ADTString('goodgoogle') self.obj.data='goodgoogle' self.assertEqual(self.obj.StrCompare(obj_T),0) self.obj.data='goodgoogl' self.assertEqual(self.obj.StrCompare(obj_T),-1) self.obj.data='goodgooglea' self.assertEqual(self.obj.StrCompare(obj_T),1) def test_Concat(self): self.obj.data='good' obj_S2=ADTString('google') self.assertEqual(self.obj.Concat(obj_S2),'goodgoogle') self.obj.data='' self.assertEqual(self.obj.Concat(obj_S2),'google') def test_SubString(self): self.obj.data='goodgoogle' self.assertEqual(self.obj.SubString(0,0),'') self.assertEqual(self.obj.SubString(0,1),'g') self.assertEqual(self.obj.SubString(0,4),'good') self.assertEqual(self.obj.SubString(0,100),'goodgoogle') self.assertEqual(self.obj.SubString(100,1),-1) self.assertEqual(self.obj.SubString(-50,0),'') self.assertEqual(self.obj.SubString(-5,0),'') self.assertEqual(self.obj.SubString(-1,0),'') self.assertEqual(self.obj.SubString(-1,1),'') self.assertEqual(self.obj.SubString(-1,2),'') self.assertEqual(self.obj.SubString(-6,1),'g') self.assertEqual(self.obj.SubString(-6,6),'google') self.assertEqual(self.obj.SubString(-6,100),'google') self.assertEqual(self.obj.SubString(-6,10),'google') def test_Index(self): self.obj.data='goodgoogle' obj_T=ADTString('good') self.assertEqual(self.obj.Index(obj_T, 0),0) self.assertEqual(self.obj.Index(obj_T, 1),-1) self.obj.data='googlegood' self.assertEqual(self.obj.Index(obj_T, 0),6) self.assertEqual(self.obj.Index(obj_T, 7),-1) self.obj.data='' self.assertEqual(self.obj.Index(obj_T, 0),-1) def test_IndexBruteforce(self): self.obj.data='goodgoogle' obj_T=ADTString('good') self.assertEqual(self.obj.Index(obj_T, 0),0) self.assertEqual(self.obj.Index(obj_T, 1),-1) self.obj.data='googlegood' self.assertEqual(self.obj.Index(obj_T, 0),6) self.assertEqual(self.obj.Index(obj_T, 7),-1) self.obj.data='' self.assertEqual(self.obj.Index(obj_T, 0),-1) def test_IndexKMP(self): self.obj.data='goodgoogle' obj_T=ADTString('good') self.assertEqual(self.obj.Index(obj_T, 0),0) self.assertEqual(self.obj.Index(obj_T, 1),-1) self.obj.data='googlegood' self.assertEqual(self.obj.Index(obj_T, 0),6) self.assertEqual(self.obj.Index(obj_T, 7),-1) self.obj.data='' self.assertEqual(self.obj.Index(obj_T, 0),-1) def test_Replace(self): self.obj.data='good' obj_T=ADTString('good') obj_V=ADTString('replace') self.assertEqual(self.obj.Replace(obj_T, obj_V),'replace') self.obj.data='googlegood' self.assertEqual(self.obj.Replace(obj_T, obj_V),'googlereplace') self.obj.data='goodgooglegood' self.assertEqual(self.obj.Replace(obj_T, obj_V),'replacegooglereplace') self.obj.data='' self.assertEqual(self.obj.Replace(obj_T, obj_V),'') self.obj.data='aaa' self.assertEqual(self.obj.Replace(obj_T, obj_V),'aaa') def test_StrInsert(self): self.obj.data='goodgoogle' obj_T=ADTString('insert') self.assertEqual(self.obj.StrInsert(0,obj_T),'insertgoodgoogle') self.assertEqual(self.obj.StrInsert(100,obj_T),-1) self.assertEqual(self.obj.StrInsert(len(self.obj.data),obj_T),'goodgoogleinsert') self.assertEqual(self.obj.StrInsert(4,obj_T),'goodinsertgoogle') self.assertEqual(self.obj.StrInsert(-1,obj_T),'goodgooglinserte') self.assertEqual(self.obj.StrInsert(-100,obj_T),-1) def test_StrDelete(self): self.obj.data='goodgoogle' self.assertEqual(self.obj.StrDelete(0,4),'google') self.assertEqual(self.obj.StrDelete(0,100),'') self.assertEqual(self.obj.StrDelete(-1,1),'goodgooge') self.assertEqual(self.obj.StrDelete(-2,3),'goodgle') self.assertEqual(self.obj.StrDelete(-2,100),'le') self.assertEqual(self.obj.StrDelete(-100,1),-1) suite = unittest.TestLoader().loadTestsFromTestCase(TestADTStringMethods) unittest.TextTestRunner(verbosity=2).run(suite)
执行的结果如下:
test_ClearString (__main__.TestADTStringMethods) ... ok test_Concat (__main__.TestADTStringMethods) ... ok test_Index (__main__.TestADTStringMethods) ... ok test_IndexBruteforce (__main__.TestADTStringMethods) ... ok test_IndexKMP (__main__.TestADTStringMethods) ... ok test_Replace (__main__.TestADTStringMethods) ... ok test_StrCompare (__main__.TestADTStringMethods) ... ok test_StrCopy (__main__.TestADTStringMethods) ... ok test_StrDelete (__main__.TestADTStringMethods) ... ok test_StrInsert (__main__.TestADTStringMethods) ... ok test_StrLength (__main__.TestADTStringMethods) ... ok test_StringEmpty (__main__.TestADTStringMethods) ... ok test_SubString (__main__.TestADTStringMethods) ... ok ---------------------------------------------------------------------- Ran 13 tests in 0.001s OK [Finished in 0.1s]
Python用类实现串以及对串的方法进行单元测试的更多相关文章
- Python: 自定义类对象序列化为Json串
之前已经实现了Python: Json串反序列化为自定义类对象,这次来实现了Json的序列化. 测试代码和结果如下: import Json.JsonTool class Score: math = ...
- 编写一个类,其中包含一个排序的方法Sort(),当传入的是一串整数,就按照从小到大的顺序输出,如果传入的是一个字符串,就将字符串反序输出。
namespace test2 { class Program { /// <summary> /// 编写一个类,其中包含一个排序的方法Sort(),当传入的是一串整数,就按照从小到大的 ...
- 类对象序列化为json串,json串反序列化为类对象
1.类对象序列化为json串: 方法一: class P(object): def __init__(self,name,age,sex): self.name=name self.age=age s ...
- Python中读取文件中的json串,并将其写入到Excel表格中
Json:JavaScript Objective Notation,是一种轻量级的数据交换格式.Json最广泛的应用是作为AJAX中web服务器和客户端的通讯的数据格式.现在也常用语http请求中, ...
- 也说python的类--基于python3.5
在面向对象的语言中,除了方法.对象,剩下的一大重点就是类了,从意义上来讲,类就是对具有相同行为对象的归纳.当一个或多个对象有相同属性.方法等共同特征的时候,我们就可以把它归纳到同一个类当中.在使用上来 ...
- Python笔记——类定义
Python笔记——类定义 一.类定义: class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性 如果直接使用类名修改其属 ...
- 【python】类中的self
在python的类中,经常会写self,代表对象自己.如下例: #coding=utf-8 class Foo: def __init__(self, name): self.name = name ...
- python基础——类和实例
python基础——类和实例 面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都 ...
- python的类和对象——进阶篇
写在前面的话 终于,又到了周五.当小伙伴们都不再加班欢欢喜喜过周末的时候,我刚刚写完这一周的游戏作业,从面对晚归的紧皱眉头到现在的从容淡定,好像只有那么几周的时间.突然发现:改变——原来这么简单.很多 ...
随机推荐
- org.springside.modules.orm中的page类自我解读
// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler ...
- ArcEngine 关于缩放至一定比例显示地图的问题
有这一句就行了.axMapControl.get_Layer(i).MinimumScale=j;i为该图层的indexj为比例尺的分母
- 模块之字节编译的.pyc文件---from.import语句
字节编译的.pyc文件输入一个模块相对来说是一个比较费时的事情,所以Python做了一些技巧,以便使输入模块更加快一些.一种方法是创建 字节编译的文件 ,这些文件以.pyc作为扩展名.字节编译的文件与 ...
- Classification of text documents: using a MLComp dataset
注:原文代码链接http://scikit-learn.org/stable/auto_examples/text/mlcomp_sparse_document_classification.html ...
- ZOJ 3923 Handshakes
水题. 算一下每个人和之前的人握手次数+之后的人和这个人握手次数.取最大值. #include<cstdio> #include<cstring> #include<cm ...
- 128階數的Shunt音量控制器
源:128階數的Shunt音量控制器 紅外線遙控 - 256階Shunt音量及控制及音源 選擇器
- LPC2478时钟模块详解
时钟框图如上图,系统时钟来源分别是内部4M的RC振荡器和外置晶振,RTC模块在某些情况下也可以作为主时钟,经过系统时钟选择s\de时钟需要经过PLL倍频(或者不倍频),处理过的PLL输出USB时钟分频 ...
- ios上 更改 状态栏(UIStatusBar)的颜色,你值得一看、收藏
IOS上 关于状态栏的相关设置(UIStatusBar) 知识普及 ios上状态栏 就是指的最上面的20像素高的部分 状态栏分前后两部分,要分清这两个概念,后面会用到: 前景部分:就是指的显示电池.时 ...
- C#调用bat 不显示DOS窗口,禁止DOS窗口一闪而过
ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.CreateNoWindow = true;//不创建窗口
- 10天学会phpWeChat——第九天:数据库增、删、改、查(CRUD)操作
数据库的操作(CRUD)是一个现代化计算机软件的核心,尤其针对web应用软件.虽然在前面的几讲里,我们针对数据库操作大致有了一些了解,但今天我们需要再次强化下. 除了新瓶装老酒,我们今天还引入一个新的 ...