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的类和对象——进阶篇
写在前面的话 终于,又到了周五.当小伙伴们都不再加班欢欢喜喜过周末的时候,我刚刚写完这一周的游戏作业,从面对晚归的紧皱眉头到现在的从容淡定,好像只有那么几周的时间.突然发现:改变——原来这么简单.很多 ...
随机推荐
- iOS WebView的用法
一.UIWebView 可以加载和显示某个URL的网页,也可以显示基于HTML的本地网页或部分网页: a. 加载 URL WebView = [[UIWebView alloc] initWithFr ...
- js 各种常用js验证
判断http或者https var http = 'https:' == document.location.protocol ? false : true; js的类型检测方式 /**** js的类 ...
- Tomcat 静态部署 二步特别注意
一.修改server.xml 在Host 节点添加如下配置 <!-- path 为请求url地址 docBase 为项目文件绝对地址制定到WebContent根目录下 --> <Co ...
- nexus 中央仓库
nexus 中央仓库 下载地址:http://www.sonatype.org/nexus/archived 下载最新版本 mkdir -p /opt/local/nexus tar zxvf nex ...
- margin负值-内秀篇
zccst整理 margin系列之布局篇 margin系列之bug巡演(三) margin系列之bug巡演(二) margin系列之内秀篇(二) margin系列之bug巡演 margin系列之内秀篇 ...
- 基于FPGA的OLED真彩色动态图像显示的实现
源:基于FPGA的OLED真彩色动态图像显示的实现 作为第3代显示器,有机电致发光器件(Organic Light Emitting Diode,OLED)由于其主动发光.响应快.高亮度.全视角.直流 ...
- 10天学会phpWeChat——第八天:Form类,丰富表单提交的字段类型
通过前面七讲的系列教程,我们完成了一个包含后台并自适应PC+h5移动端的文章管理模块. 在实际的生产环境中,文章投稿.商品上传等操作并不会简单局限于一个text和textarea组成的表单.在实际中, ...
- iOS开发——汉字转拼音
以前有一次做一个天气预报的项目,有一个功能是输入城市名,请求该城市的天气,需要把汉字转化成拼音,比如深圳——>shenzhen,加入到参数中.当时在网上找了一下,网友给出的方法很多都用不了,现在 ...
- IOS即时通讯XMPP搭建openfire服务器 分类: ios技术 2015-03-07 11:30 53人阅读 评论(0) 收藏
一.下载并安装openfire 1.到http://www.igniterealtime.org/downloads/index.jsp下载最新openfire for mac版 比如:Openfir ...
- Maven项目中pom文件分析
pom英文全称: project object model 1.概述 pom.xml文件描述了maven项目的基本信息,比如groupId,artifactId,version等.也可以对maven项 ...