第一次个人编程作业

一、GitHub链接

二、PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planing 计划 30 40
Estimate 估计这个任务需要多少时间 100 130
Development 开发 210 240
Analysis 需求分析(包括学习新技术) 300 480
Design Spec 生成设计文档 60 50
Design Review 设计复审 20 18
Coding Standard 代码规范(为目前的开发制定合适的规范) 30 30
Design 具体设计 120 100
Coding 具体代码 240 280
Code Review 代码复审 50 40
Test 测试(自我测试,修改代码,提交修改) 30 50
Reporting 报告 60 80
Test Repor 测试报告 20 20
Size Measurement 计算工作量 15 15
Postmortem&Process Improvement Plan 事后总结,并提出过程改进计划 30 30
合计 1315 1603

三、计算机块接口的设计与实现过程

1、使用函数

def get_phonenumber(string):  #电话
def get_province(string): #直辖市/省(省级)
def get_city(string):  #直辖市/市(地级)
def get_area(string):  #区/县/县级市(县级)
def get_town(string): #街道/镇/乡(乡镇级)
def get_road(string): #路名
def get_housenum(string):#门牌号
def cutdown(origin,child):# 把child字符串从origin字符串中删掉

2.难度等级

grade=string[0]
string=string[2:]

3.姓名

因为名字和后面的地址电话有用都好分隔开,所以使用split函数

name=List[0]
nstring = List[1] #地址+电话
nstring = nstring.split('.')[0]

4.手机号

这里使用正则表达式pattern = re.compile(r'1\d{10}'),之后再使用split函数把电话从地址里面删掉List=string.split(telnum) string=List[0]+List[1]

5.(核心)找到省

找到省的时候会遇到几个问题:
①缺少“市”、“省”,“自治区”,这时候用正则表达式是找不出来的,或者找出来的是后面地级市的名字,但是我发现这些省份除了黑龙江和内蒙古,其他省份都是只有两个字,所以返回前两个字符就好了,黑龙江内蒙古返回前三个字符。最后判断一下几个特殊的省份和自治区,给它加上后缀名。
②用正则表达式找出来之后,如果是“北京市”、“上海市”这样的还得把后面的“市”删掉,还得顺便把city赋值为“北京市”之后才能再执行cutdown函数
以下是找到省份的代码段:

def get_province(string): 
    pattern = re.compile(r'(.*?[省])|(.*?自治区)|北京市|上海市|天津市|重庆市')
    result = pattern.search(string) 
    if result== None or len(result.group(0))>7:#漏了市或者省
        if string[0:3] =='内蒙古':
            return '内蒙古'
        if string[0:3] == '黑龙江':
            return '黑龙江'
        else:
           return string[0:2]
    return result.group(0)

然后判断省份的代码段:

province = get_province(address)
address = cutdown(address,province)
if province in ('北京市','重庆市','上海市','天津市' ):
    province = province[0:2] 
elif province == '新疆':
    province = province+'维吾尔自治区'
    
elif province == '内蒙古':
    province = province + '自治区'
    
elif province == '西藏':
    province = province+'自治区'
elif province == '广西':
    province == province + '壮族自治区'
elif province == '宁夏':
    province=province+'回族自治区'
elif province[-1]!='省' and  province[-1]!='区':
    province=province+'省'

6.(核心)找到市

和省差不多,如果遇到“市”漏了的城市的话很有可能会因为后面的地址有市而匹配错误,所以这里也应该有个判断。匹配不成功的话就取地址前两个字符去和已经收集好的城市去一个一个匹配。
代码如下:

def get_city(string):                                                                                     #二级地址
    pattern = re.compile(r'(.*?[市])|(.*?自治州)')
    result = pattern.search(string)
    if result==None or len(result.group(0))>6:#漏了市
        for c in cities:
            if c[:2]==string[:2]:
                return c
        return ' '
    else :
        return result.group(0)

找到后判断

    city = get_city(address)
    address= cutdown(address,city)
    if province in ('北京','重庆','上海','天津'):
        city= province+'市'
    elif city !=' ' and city[-1] !='市' and city[-3:-1] !='自制' :
        city = city+'市'

7.找到区,步骤和省市差不多

代码如下:

def get_area(string):                                                                                      #三级地址
    pattern = re.compile(r'(.*?区)|(.*?县)|(.*?市)|(.*?自治旗)')
    result = pattern.search(string)
    if result == None or len(result.group(0))>10:
        for a in areas:
            if a[0:2]==string[0:2]:
                return a
        return ' '
    return result.group(0)

8.接下来的地址就直接正则匹配了

找到town的正则表达式为:r'(.?[镇乡])|(.?街道)'
找到road的正则表达式为:r'(.?[街])|(.?[道])|(.?[路])|(.?[巷])|(.?[大街])|(.?[街道])'
找到housenum的正则表达式为:r'(.*?[号])'

9.输出

最后把这些数据用字典存储起来,最后输出使用json输出

四、计算机块接口部分的性能改进

第一次个人编程作业_第1张图片
第一次个人编程作业_第2张图片
第一次个人编程作业_第3张图片
第一次个人编程作业_第4张图片

花费时间最多的是imput函数,害,这也没法优化

五、计算机模块部分单元测试展示

部分模块和函数说明已经在上面啦~~
下面是测试结果:
第一次个人编程作业_第5张图片
再提升我也不会啦

六、计算模块部分异常处理说明

主要有两个问题,判断城市的时候我的代码是:

if province in ('北京','重庆','上海','天津'):
        city= province+'市'
    elif city !=' ' and city[-1] !='市' and city[-3:-1] !='自制' :
        city = city+'市'

一开始我的elif的判断条件是elif city !=' ' and city[-1] !='市' and city[--] !='州' ,本来是为了排除那些自治州的地名,但是如果是福建省福州闽侯县的话,本该判断结果是福州应该加上一个市,可是因为最后一个字是州,就没有进入该判断语句,输出城市的时候只有福州。最后改判断条件为不等于自制
还有一个问题啊是一开始我的电话号码的正则表达式是这样的:r'0?(13|14|15|18|17)[0-9]{9}。后面发现测试数据的手机号有的不是正常的手机号,比如1340000000什么的。。。。害,直接用r'1\d{10}'

你可能感兴趣的:(第一次个人编程作业)