在撸码过程中,总有很多代码需要重构,码一个问候用户的小例子,加深对代码重构的印象。

原始代码:

 1 import json
2
3 filename = 'username.json' #定义文件名
4
5 try:
6 with open(filename) as file_object:
7 username = json.load(file_object) #加载存储的用户名,如果有的话
8
9 except FileNotFoundError:
10 username = input("what is your name: ")
11 with open(filename,'w') as file_object: #以写入的方式打开文件filename
12 json.dump(username,file_object) #将username写入到文件对象中
13 print("We will remember you when you back " +username + "!") #打印问候语
14
15 else:
16 print("Welcome back, " + username + "!") #打印问候语

代码重构1,将代码全部封装到一个函数里面:

 1 import json
2
3 '''定义函数,用于代码封装'''
4 def greet_user():
5 filename = 'username.json'
6 try:
7 with open(filename) as file_object:
8 username = json.load(file_object)
9
10 except FileNotFoundError:
11 username = input("What is your name: ")
12 with open(filename,'w') as file_object:
13 json.dump(username,file_object)
14 print("We will remember you when you back, " + username + "!")
15
16 else:
17 print("Welcome back, " + username + "!")
18
19 greet_user() #调用函数问候

代码重构2,将代码重构1的函数进一步拆分,让函数greet_user()不执行那么多任务,我们将获取存储的用户名的代码写到另一个get_stored_user()函数中。

 1 import json
2
3
4 def get_stored_user():
5 filename = 'username.json'
6 try:
7 with open(filename) as file_object:
8 username = json.load(file_object)
9
10 except FileNotFoundError:
11 return None
12
13 else:
14 return username
15
16
17 def greet_user():
18 username = get_stored_user()
19 if username:
20 print("Welcome back " + username + "!")
21 else:
22 username = input("What is your name: ")
23 filename = 'username.json'
24 with open(filename,'w') as file_object:
25 json.dump(username,file_object)
26 print("We will remember you when you back, " + username + "!")
27
28 greet_user() #调用函数问候

代码重构3,由于最终的目的是问候用户,我们可以将重构2里的代码进一步拆分,将没有用户名的时候提示输入用户名的代码存储在另外一个函数中。

 1 import json
2
3 def get_stored_user():
4 '''定义函数以获取存储了的用户名'''
5 filename = 'username.json'
6 try:
7 with open(filename) as file_object:
8 username = json.load(file_object)
9 except FileNotFoundError:
10 return None
11 else:
12 return username #返回用户名
13
14 def get_new_user():
15 '''定义函数以获取用户输入'''
16 username = input("What is your name: ")
17 filename = 'username.json'
18 with open(filename,'w') as file_object:
19 json.dump(username,file_object)
20
21 return username #返回用户名
22
23 def greet_user():
24 '''定义函数问候用户'''
25 username = get_stored_user()
26 if username:
27 print("Welcome back, " + username + "!")
28 else:
29 username = get_new_user()
30 print("We will remember you when you back, " + username + "!")
31
32 greet_user() #调用函数,打印问候语

代码重构的意义在于,简化同一个代码块的任务量,让代码更容易读懂。

python之代码重构的更多相关文章

  1. 让代码重构渐行渐远系列(3)——string.Equals取代直接比较与非比较

    重构背景及原因 最近由于项目组的人员在不断扩充,导致项目中代码风格各异,大有百花齐放甚至怒放之势.考虑到团队的生存与发展,经过众人多次舌战之后,最终决定项目组根据业务分成几个小分队,以加强团队管理与提 ...

  2. C++代码重构——从C global到C++ template

    在学数据结构的时候,我常有这样目标--写出能够最大程度复用的代码(算法正确,封装优秀).我常想--如何能在短时间内达成"算法正确,封装优秀"这样的目标.经过一段时间的摸索,我的结论 ...

  3. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(十二) 代码重构使用反射工厂解耦(一)缓存切换

    前言 上一篇中,我们用了反射工厂来解除BLL和UI层耦合的问题.当然那是最简单的解决方法,再复杂一点的程序可能思路相同,但是在编程细节中需要考虑的就更多了,比如今天我在重构过程中遇到的问题.也是接下来 ...

  4. CSS代码重构与优化之路

    作者:@狼狼的蓝胖子 网址:http://www.cnblogs.com/lrzw32/p/5100745.html 写CSS的同学们往往会体会到,随着项目规模的增加,项目中的CSS代码也会越来越多, ...

  5. NET代码重构

    记一次.NET代码重构   好久没写代码了,终于好不容易接到了开发任务,一看时间还挺充足的,我就慢慢整吧,若是遇上赶进度,基本上直接是功能优先,完全不考虑设计.你可以认为我完全没有追求,当身后有鞭子使 ...

  6. 代码重构 & 常用设计模式

    代码重构 重构目的 相同的代码最好只出现一次 主次方法 主方法 只包含实现完整逻辑的子方法 思维清楚,便于阅读 次方法 实现具体逻辑功能 测试通过后,后续几乎不用维护 重构的步骤 1  新建一个方法 ...

  7. Python一行代码

    1:Python一行代码画出爱心 print]+(y*-)**-(x**(y*<= ,)]),-,-)]) 2:终端路径切换到某文件夹下,键入: python -m SimpleHTTPServ ...

  8. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(十一) 代码重构使用反射工厂解耦

    前言 自从此博客发表以及代码开源以来,得到了许多人的关注.也没许多吧,反正在我意料之外的.包括几位大牛帮我做订阅号推广,真的很感谢他们.另外,还有几个高手给我提了一些架构上的问题.其实本身这个项目是没 ...

  9. python爬虫代码

    原创python爬虫代码 主要用到urllib2.BeautifulSoup模块 #encoding=utf-8 import re import requests import urllib2 im ...

随机推荐

  1. gitlab private-token利用工具

    在渗透测试中,经常会遇到只获得gitlab PRIVATE-TOKEN的情况,而gitlab提供了一系列的api给我们通过这个token去访问gitlab. 所以做了个简单的gitlab工具,以供紧获 ...

  2. DFS序专题

    牛客专题之DFS序 简介 dfs序: 每个节点在dfs深度优先遍历中的进出栈的时间序列,也就是tarjan算法中的dfn数组. 画个图理解一下: 这棵树的dfs序:1 3 2 4 2 5 6 7 6 ...

  3. sentinel配置

    登陆接口 QPS5,异常0.8,熔断10s 1.异地登陆同省逻辑降级security 2.可疑用户判断certification 3.是否是危险设备判断account 4.是否是自动化imei,ime ...

  4. BootstrapBlazor 组件库使用体验---Table篇

    原文地址:https://www.cnblogs.com/ysmc/p/13323242.html Blazor 是一个使用 .NET 生成交互式客户端 Web UI 的框架: 使用 C# 代替 Ja ...

  5. 软件工程与UML第三次作业

    博客班级 软件工程与UML2班 作业要求 本次作业要求 作业目标 <给至少5名同学提他的代码issue并用博客记录;根据收到的issue修改自己的代码> 作业源代码 我的码云仓库 学号 & ...

  6. 解决 JPA 插入 MySQL 时间与实际时间差 13 个小时问题

    问题描述 公司使用的阿里云数据库服务器,插入时间与实际时间差 13 个小时 执行 show variables like "%time_zone%"; 结果如下: Variable ...

  7. maven依赖问题的出现原因与解决方式

    摘要 maven依赖问题作为开发者应该是经常遇到的问题,在个人单独开发单独维护的项目里,可能体现不那么明显,一是自己对导入的jar大部分都很明确,二是出现问题第一解决发现也很快,问题就没那么严重,而在 ...

  8. PyQt(Python+Qt)学习随笔:QTabWidget选项卡部件的documentMode属性作用

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTabWidget的documentMode属性用于控制是否以适合文档页的模式呈现选项卡部件.这与 ...

  9. AWD不死马与克制方法

    一个简单的不死马如: <?php ignore_user_abort(true); set_time_limit(0); unlink(__FILE__); $file = '.3.php'; ...

  10. 分别使用python和java练习冒泡排序

    冒泡排序算法的运作如下:(从小到大)   比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针 ...