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

原始代码:

 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. ClassLoader分类

    对于类装载器而言一共有三种, 1分别是加载rt包下的Bootstrap加载器,是用C++写的,是在java最早发布的时候写的,用于加载那些最初的类. 2然后java在发展过程中又要发布新的jdk,所以 ...

  2. 【mq读书笔记】mq producer启动流程

    创建MQClientInstance实例.这里有个实例缓存 clienrId为客户端IP+instance+(unitname)注意到之前把instance替换为进程id,是为了instance为默认 ...

  3. 【抓取】6-DOF GraspNet 论文解读

    [抓取]6-DOF GraspNet 论文解读 [注]:本文地址:[抓取]6-DOF GraspNet 论文解读 若转载请于明显处标明出处. 前言 这篇关于生成抓取姿态的论文出自英伟达.我在读完该篇论 ...

  4. 1. 揭秘Spring类型转换 - 框架设计的基石

    仰不愧天,俯不愧人,内不愧心.关注公众号[BAT的乌托邦],有Spring技术栈.MyBatis.JVM.中间件等小而美的原创专栏供以免费学习.分享.成长,拒绝浅尝辄止.本文已被 https://ww ...

  5. 初探Lerna

    1.简介 首先是关于Monorepo(一篇不错的介绍Monorepo的文章),它是管理项目代码的一种方式,主要手段是通过在一个项目仓库中管理多个模块/仓库包.而Multirepo是传统的仓库管理方法, ...

  6. vue回调接口

    1.微博回调接口 1.1oauth/urls.py 中添加路由 urlpatterns = [ path('weibo/callback/', views.OauthWeiboCallback.as_ ...

  7. Python中对输入的可迭代对象元素排序的sorted函数

    sorted根据输入可迭代对象中的项返回一个新的已排序列表,原输入参数对象中的数据不会发生变化. 具体可参考:<Python中与迭代相关的函数>的详细介绍 老猿Python,跟老猿学Pyt ...

  8. Python中字符串使用单引号、双引号标识和三引号标识,什么是三引号?什么情况下用哪种标识?

    一.三引号是指三个单引号或者三个双引号: 二.Python中字符串如果以单引号.双引号标识和三引号标识开头,则字符串结尾也必须是对应的标识,不能变更: 三.三者的异同: 1.三者都是字符串,大部分情况 ...

  9. 中间件面试专题:RabbitMQ高频面试问题

  10. js原生方法map实现

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...