1.github地址:https://github.com/cheslee15/031702245
psp表格
PSP2.1 | Personal Software process Stage | 预估耗时 | 实际耗时 |
---|---|---|---|
Planning | 计划 | 30 | 20 |
Estimate | 估计这个任务需要多少时间 | 600 | 1200 |
Development | 开发 | 120 | 240 |
Analysis | 需求分析 (包括学习新技术) | 120 | 420 |
Design Spec | 生成设计文档 | 30 | 30 |
Design Review | 设计复审 | 15 | 20 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
Design | 具体设计 | 20 | 20 |
Coding | 具体编码 | 120 | 180 |
Code Review | 代码复审 | 30 | 30 |
Test | 测试(自我测试,修改代码,提交修改) | 30 | 60 |
Reporting | 报告 | 60 | 60 |
Test Repor | 测试报告 | 30 | 60 |
Size Measurement | 计算工作量 | 20 | 20 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 20 | 30 |
- | 合计 | 655 | 1200 |
解题思路
实现基本功能:
将不规范的乱序的地址簿做规范化处理,注意点:
1.直辖市与一般城市的匹配区别,如样例中的小美。
2.手机号码一定不会和地址中的数字相邻,即不会出现福州市西二环路11380502116922号或者福州大学30#31395521336233这样的情况。
3.地址最终格式应为["直辖市/省","直辖市/市","区/县/县级市","街道/镇/乡","详细地址"]
具体实现:
- 首先,根据输入的数据,利用“.”将输入的数据切分为若干个数组
- 在每个数组中,利用正则匹配,首先将姓名和电话找出
- 在每次匹配过后,利用replace函数将之前匹配的内容从该数组擦除,然后再对后面的内容进行匹配,并且要注意输出格式
正则匹配参考:https://www.runoob.com/regexp/regexp-syntax.html
实现的主要函数:
函数名 | 功能 |
---|---|
x.split( ) | 根据关键字将文本切分为数组 |
x.replace() | 擦出数组中的指定内容 |
x.findall() | 正则匹配指定内容 |
部分代码:
province= re.findall(r",(.*?)省", name)
if province:
print("地址:",end="")
print(province[0], end="")
print("省",end="")
print(",", end="")
name = name.replace(province[0],"")
name = name.replace("省", "")
city = re.findall(r",(.*?)市", name)
print(city[0], end="")
print("市", end="")
print(",", end="")
name=name.replace(city[0],"")
name = name.replace("市", "")
性能分析:
cprofile——python性能分析工具:https://www.cnblogs.com/kaituorensheng/p/4453953.html
性能测试结果如下:
_ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000s 0.000s 11.314s 11.314s firtst.py:1()
1 0.000s 0.000s 11.314s 11.314s firtst.py:2(xxx)
1 0.000s 0.000s 11.314s 11.314s {built-in method builtins.exec}
1 11.314s 11.314s 11.314s 11.314s {built-in method builtins.input}
1 0.000s 0.000s 0.000s 0.000 s {method 'disable' of '_lsprof.Profiler' objects}
1 0.000s 0.000s 0.000s 0.000 s {method 'split' of 'str' objects}_
- 对函数进行分析,显然自己代码的瓶颈是在于无脑。这样虽然可以比较方便,或者说比较偷懒,但是的的确确给自己的程序性能带来了很大的影响。
- 对于菜鸟来说,无脑不失为解决问题的好方法。可是没办法解决一些特殊情况。
- 解决办法:找到可行的app或者网页,利用python向http发包,找一个合适的接口,接收到的数据已经对地址进行了分类,这样可以更精准的定位。
单元测试:
测试数据输入:
李四,福建省福州13756899511市鼓楼区鼓西街道湖滨路110号湖滨大厦一层.
小美,北京市东15822153326城区交道口东大街1号北京市东城区人民法院.
小陈,广东省东莞市凤岗13965231525镇凤平路13号.
控制台输出:
姓名:李四,手机:13756899511,地址:福建省,福州市,鼓楼区,鼓西街道,湖滨路110号湖滨大厦一层
姓名:小美,手机:15822153326,地址:北京,北京市,东城区, ,交道口东大街1号人民法院
姓名:小陈,手机:13965231525,地址:广东省,东莞市, ,凤岗镇,凤平路13号
异常样例:
当测试数据不是从”省“开始时,程序会报错,需要先匹配到下一级地址,再返回上一级地址
province= re.findall(r",(.*?)省", name)
if province:
........
else:
city= re.findall(r",(.*?)市",name)
print("地址:",end="")
print(city[0], end="")
print(",", end="")
print(city[0],end="")
print("市", end="")
print(",", end="")
name = name.replace(city[0], "")
name = name.replace("市", "")
classify= re.findall(r",(.*?)区", name)
总结与思考:
- 关于github:之前只是皮毛的建了个基于hexo的个人主页。并没有很好的理解Github的作用。直到在写完基本功能后,尝试去学习了下Github的入门教程,仿佛发现了一片新天地。每次修改完一次的功能,就commit一下。然后可以看到自己的成长的过程,这种感觉很棒。但是自己目前仍然对github的一些命令不大熟悉,导致自己曾经有一次把库搞炸了,重头foke了一下。同时,在使用的过程中,阅读了畅畅酱博客以及构建之法的相关知识。知道了注释以及这些信息的提交尽量不要使用中文,所以在这个过程中逐渐养成了这个习惯。自己的英语功底不好,有时候还要借助谷歌翻译,但是这也是一个进步。而缺点在于,还是没有能够清晰的给出commit信息。这个需要慢慢培养一下自己。
- 性能测试:性能测试前,知道自己写的代码有点渣,也清楚在那些部分肯定是泛红的一片。导致这中原因,主要在于自己没有能够好好的分析需求,追求时间,仓促编码,而省下来的这部分时间却在编码的过程中翻倍付出。软工实践不是那种走一步看一步的事情。如果没有能够以一个相对大局的观念,统筹规划一下,组织好代码结构,写好对应的流程图,会对之后的编码以及代码的性能,可扩展性有很大的帮助的。
一边丧,一边努力寻找阳光~~~