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的类和对象——进阶篇
写在前面的话 终于,又到了周五.当小伙伴们都不再加班欢欢喜喜过周末的时候,我刚刚写完这一周的游戏作业,从面对晚归的紧皱眉头到现在的从容淡定,好像只有那么几周的时间.突然发现:改变——原来这么简单.很多 ...
随机推荐
- Hibernate查询之API查询
Hibernate在检索数据上,可以使用SQL.HQL和官方API进行查询,本人主要利用API进行相关查询的小demo. 话不多少直接上demo. demo1:基本查询 /** * 默认不加任何条件的 ...
- Android Camera HAL浅析
1.Camera成像原理介绍 Camera工作流程图 Camera的成像原理可以简单概括如下: 景物(SCENE)通过镜头(LENS)生成的光学图像投射到图像传感器(Sensor)表面上,然后转为电信 ...
- Initialization of bean failed; nested exception is java.lang.reflect.MalformedParameterizedTypeExcep
body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...
- python字符串,列表,字典的常用方法
本篇内容 字符串的常用方法 列表的常用方法 字典的常用方法 字符串的常用方法 center 字符居中显示,指定字符串长度,填充指定的填充字符 string = "40kuai" p ...
- 编码器芯片MLX90363的使用
文档资料 MLX90363 Datasheet MLX90363 Application Note 使用 对于编码器来说,Rotary Application模式 SPI驱动中,CS必须在8个字节都发 ...
- (中等) POJ 2482 Stars in Your Window,静态二叉树。
Description Here comes the problem: Assume the sky is a flat plane. All the stars lie on it with a l ...
- PHPCMS v9 列表页实现文件下砸
{template "content","header"} <div class="list"> <div class=& ...
- LPC1768的USB-相关结构体定义
#ifndef __USB_H__ #define __USB_H__ //usb传输数据的宏定义描述 #include "sys.h" typedef __packed unio ...
- LPC1768定时器普通定时
//其他通道的基本定时功能都能在这里实现 void Time0Mr0Init(u32 arr,u32 psc) { LPC_SC->PCONP |= (1<<1); ...
- Linux ALSA声卡驱动之二:声卡的创建
1. struct snd_card 1.1. snd_card是什么 snd_card可以说是整个ALSA音频驱动最顶层的一个结构,整个声卡的软件逻辑结构开始于该结构,几乎所有与声音相关的逻辑设备都 ...