第一次个人编程作业

一、源码

Github地址:https://github.com/wjx-1999/031702547


二、psp表格

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

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

前期准备

首先接触到这个问题,最初是想要使用c++来实现的,后来发现输出还要用json的格式,要用c++手写json的输出,并参考了其他大佬的c++做法,这简直是噩梦难度,于是放弃了。暑假期间稍微学习了一部分的python,这时候就派上用场了。py里面有re、json、cpca模块,大大简化了问题难度。

导入模块 主要功能
re 提供各种正则表达式的操作
json 将输出文件的格式转换为json
cpca 用于提取简体中文字符串中省,市和区

思路

  • 首先我们使用正则表达式,将输入的字符串切割得到姓名、电话、剩余的字符串s1
  • 接着使用cpca,将s1切割,得到了省、市、区、剩余部分s2
  • 对于剩余的部分,手动在分出镇、街道、乡等信息,得出一个五级地址

模块接口设计

接口 主要功能
match_name_tel 得到姓名、电话信息
transform 提取简体中文字符串中省,市和区
address_book 得出五级地址
json.dumps 输出json格式的数据

实现过程

得到姓名、电话、和省市区信息,相当于得到三级地址

def match_name_tel(s: str):  # get name and phone number
    s = s.rstrip(".")
    match = s.split(",")
    name = match[0] #get name
    tel = re.search('\d{11}', match[1]).group(0) #get phone number
    mat = re.split('\d{11}', match[1])
    rest_addr = mat[0] + mat[1]  # join two string
    DataFrame = cpca.transform([rest_addr])  # use the ilst
    return (name, tel, DataFrame)

剩余字串切割,得到五级地址

def address_book(str0 : str):
    name, phone, tmp = match_name_tel(str0)
    newaddr = []
    str_rest = tmp.values[0]
    for addr in str_rest:
        newaddr.append(addr)
    # split the street\town\village
    lastaddr = newaddr.pop()

    if newaddr[0] == '北京市' or'天津市'or'上海市'or '重庆市' :
        str = newaddr[0].replace('市','')
        newaddr[0] = str
    address = newaddr
    addr_rest = lastaddr.split('街道', 1)
    if len(addr_rest) > 1:
        addr_rest[0] += "街道"
    else:
        addr_rest = lastaddr.split('镇', 1)
        if len(addr_rest) > 1:
            addr_rest[0] += "镇"
        else:
            addr_rest = lastaddr.split('乡', 1)
            if len(addr_rest) > 1:
                addr_rest[0] += "乡"
            else:
                addr_rest.insert(0, '')
    address = newaddr + addr_rest
    info = {
        "姓名": name,
        "手机": phone,
        "地址": address
    }
    # get the json type data
    info_data = json.dumps(info, ensure_ascii=False)
    print(info_data)

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

主要时间除了输入部分,主要就是直接调用cpca的transform函数,几乎占用了全部时间,除非我自己手动分析写一个类似的函数(主要还是懒啊),不然基本无法降低时间
在这里插入图片描述
这是用pycharm的profile出来的图片
在这里插入图片描述

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

部分例子
1!伯诽,浙江杭州市下城区石桥街道石桥路344号天堂园社区汽轮宿14784456463舍5幢.
1!蔡细披,上海市奉贤区泽丰路88弄恒13538603055盛豪庭.
1!谢逐,广东省汕头澄海区竹林村德生巷8号竹林幼儿园13893984659.
1!徐籍,天津市宁河区大15509925167北涧沽镇大北路宁河区大北涧沽镇中兴沽村村民委员会.
1!乜吨铡,安徽省合肥市瑶海区长15646257573淮街道胜利路198号合肥元一希尔顿酒店.

{"姓名": "伯诽", "手机": "14784456463", "地址": ["浙江省", "杭州市", "城区", "下城区石桥街道", "石桥路344号天堂园社区汽轮宿舍5幢"]}
{"姓名": "蔡细披", "手机": "13538603055", "地址": ["上海", "上海市", "奉贤区", "", "泽丰路88弄恒盛豪庭"]}
{"姓名": "谢逐", "手机": "13893984659", "地址": ["广东省", "汕头市", "澄海区", "", "竹林村德生巷8号竹林幼儿园"]}
{"姓名": "徐籍", "手机": "15509925167", "地址": ["天津", "天津市", "", "宁河区大北涧沽镇", "大北路宁河区大北涧沽镇中兴沽村村民委员会"]}
{"姓名": "乜吨铡", "手机": "15646257573", "地址": ["安徽省", "合肥市", "瑶海区", "长淮街道", "胜利路198号合肥元一希尔顿酒店"]}
单元测试覆盖率

在这里插入图片描述

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

这个算法对于附加题部分时间没有继续做,他对于一些要输出七级的地址就会产生错误,后面需要花费时间继续完善

3!蒯刑浦,白城市洮南市团结街道兴安南街5566号安泰社区公13949401891共事务服务中心.
{"姓名": "蒯刑浦", "手机": "13949401891", "地址": ["吉林省", "白城市", "洮南市", "团结街道", "兴安南街5566号安泰社区公共事务服务中心"]}

七、PSP表格

见第二点。

总结

这次的个人编程作业,花费了许多的时间,比预期要多很多的时间,从复习py的语法知识,搭建环境,测试样例,验证结果等等,让自己对于py有了更近一步的深入了解。自己平时时间大部分都在实验室,应该要适当的平衡实验室与平时作业的关系,不能总是在最后时刻完成。

posted on 2019-09-29 18:01  wjx_1999  阅读(193)  评论(4编辑  收藏  举报