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的类和对象——进阶篇
写在前面的话 终于,又到了周五.当小伙伴们都不再加班欢欢喜喜过周末的时候,我刚刚写完这一周的游戏作业,从面对晚归的紧皱眉头到现在的从容淡定,好像只有那么几周的时间.突然发现:改变——原来这么简单.很多 ...
随机推荐
- keystone policy.json 的学习总结
keystone的policy.json文件位于:/etc/keystone/policy.json 其内容如下: 1 { 2 "admin_required": "ro ...
- 6种炫酷的CSS3按钮边框动画特效
6种炫酷的CSS3按钮边框动画特效Button border animate 用鼠标滑过下面的按钮看看效果! Draw Draw Meet Center Spin Spin Circle Spin T ...
- (简单) POJ 1321 棋盘问题,回溯。
Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子 ...
- VI 摘要
1 行首添加注释 1 :5,10s/^/#/g 2 sed '5,10s/^/#/' 2 替换某一个行 文本为 11111 22222 33333 替换: %s/\(.*\)/http:\/\/ ...
- 反射技术在Android中的应用
本博客转自:http://blog.csdn.net/tiefeng0606/article/details/51700866 动态语言: 一般认为在程序运行时,允许改变程序结构或变量类型,这种语言称 ...
- 如何在Eclipse中安装PDT插件来开发PHP
之前查过很多PDT的安装方法,60%都是让人直接安装All-in-one的PHP eclipse版本,纯属让人无语,而有些给出的PDT安装链接无法正确下载插件,对此,给出了我安装过的PDT插件下载地址 ...
- FFT初解(转)
源:FFT初解 一.前言 首先申明俺不是一个算法工程师,俺是一个底层驱动工程师,有人会发问一个底层驱动工程师需要这个吗?但是我不幸的告诉你,确实是需要的,不过我们不要像算法工程师那样搞得很精通,但是还 ...
- iOS9网络适配
今天升级Xcode7.0,发现网络访问失败. 输出错误信息:The resource could not be loaded because the App Transport Security po ...
- UVa 369 - Combinations
题目大意:给两个数n, m,求C(n, m).用java直接写就好了. import java.io.*; import java.util.*; import java.math.*; class ...
- js脚本语言(数组)
定义:给数据Array(1,3.14,"aa")给长度(Array(5))使用方括号定义[1,3.14,"aa"] 属性:lenght(数据的长度) 方法:pu ...