在上一篇《手把手陪您学Python》36——错误和异常处理中,我们学习了错误和异常的处理方法,使我们在面对各种不确定的情况时,都能够优雅地面对,而让用户感觉不出来在我们的程序中出现了异常。
错误和异常处理是比较独立的一块内容,同时也是我们之前所介绍的Python基础编程知识的一个补充。
至此,我们已经完成了Python基础编程知识的介绍,剩下的就是我们如何在此之上去进一步学习和应用了。
今天,就将之前学习的文件操作以及异常处理的方法做一个应用和复习,我们会用一个相对真实的实例,模拟数据存储和读取的应用场景,给大家展示在实际应用中,数据的存储和读取是如何发挥作用的。
同时,也借用这个实例,给大家展示下程序重构的过程,也就是如何通过合理设置函数、优化代码结构等方式,使程序结构更加清晰,可读性更高。
1、数据存储的应用实例
当我们与计算机进行交互时,计算机一般会要求我们先输入姓名等信息,所以我们就设计一个首次与计算机交互的过程。这时,计算机就会要求我们输入自己的名字,并将其记录下来。
In [1]: import json
username = input("What's your name?")
filename = 'username.json'
with open(filename, 'w') as f:
json.dump(username, f)
print("We'll remember you when you come back, {}!".format(username))
Out[1]: What's your name? mnpy
We'll remember you when you come back, mnpy!
此时,数据文件username.json已经存储了我们的用户信息,可以打开文件看一下。当我们再次进入程序时,计算机就会先读取数据文件,然后显示欢迎界面。
In [2]: import json
filename = 'username.json'
with open(filename) as f:
username = json.load(f)
print("Welcome back, {}!".format(username))
Out[2]: Welcome back, mnpy!
接下来,我们会将上面两段程序合并。当用户进入后,计算机首先会判断用户信息是否存在,如果存在则显示欢迎界面;如果不存在则提示用户输入信息。
在这段代码中,我们会想到需要使用if...else...语句,但是对于判断条件,也就是用户信息(即username.json文件)是否存在这一条,如果存在程序能够继续运行,如果不存在可能就会报错导致程序无法继续运行了。
对于这个问题,我们可以使用异常与错误处理中的try...except...else语句。即使文件不存在,也不会因为错误而中断程序。
In [3]: import json
filename = 'username.json'
try:
with open(filename) as f:
username = json.load(f)
except FileNotFoundError:
username = input("What's your name?")
filename = 'username.json'
with open(filename, 'w') as f:
json.dump(username, f)
print("We'll remember you when you come back, {}!".format(username))
else:
print("Welcome back, {}!".format(username))
运行上面的程序,由于我们之前已经存储了username.json文件,try之后打开文件的过程不会出现异常,所以运行结果为:
Out[3]: Welcome back, mnpy!
如果我们把之前的username.json文件删除再运行这段程序,由于try之后的程序找不到文件,就会触发找不到文件(FileNotFoundError)的异常,此时就会执行except之后的程序,运行结果为:
Out[3]: What's your name? mnpy
We'll remember you when you come back, mnpy!
2、程序的重构
上面的程序实际上已经达到了我们预期的目标,但从代码的编写规范、结构的清晰程度以及可读性方面还是不是很完美(因为程序比较简单,所以不是很明显)。
这种将本已可以正常运行的程序,通过一系列的结构调整或者函数应用,使得整个程序结构更加清晰、可读性更高的过程称为重构。
下面,我们就将上面的程序优化一下,一起体验下重构的过程。
在《手把手陪您学Python》26——自定义函数中,我们提到了一个标准化的Python编程结构,就是将程序中的大部分逻辑或者代码放到一个或者多个函数中,之后将主程序定义成main()函数,同时使用“if __name__ == '__main__':”这样一个语句引导整个程序的运行。
按照这种规范性的结构,上面的程序就可以重构为:
In [4]: import json
def main(): # 主程序
def greet_user():
filename = 'username.json'
try:
with open(filename) as f:
username = json.load(f)
except FileNotFoundError:
username = input("What's your name?")
filename = 'username.json'
with open(filename, 'w') as f:
json.dump(username, f)
print("We'll remember you when you come back, {}!".format(username))
else:
print("Welcome back, {}!".format(username))
greet_user()
if __name__ == '__main__':
main()
虽然这个程序实现了标准化的程序结构,并将主要的代码都放在了greet_user()函数中,但在greet_user()函数内却并没有得到优化。也就是说,在main()函数内,也应该是由一个个函数组成的语句,而不是现在一样,一个函数内的程序仍然是一个个命令的组合。
为了实现这一目标,我们考虑到,整个程序的动作其实就是三个:1、让用户输入信息;2、获取用户信息;3、显示欢迎界面。
那么接下来,我们就将原来的程序按照这三个动作进行拆解,并将每一个动作都定义成一个函数,看看代码重构后的效果:
In [5]: """
程序名称:Welcome back!
程序作者:mnpy
程序介绍:用于获取用户信息及展示欢迎界面
程序版本:2021年1月1日 V1.0
"""
import json
# 主程序
def main():
# 1、让用户输入信息
def get_new_username():
username = input("What's your name?")
filename = 'username.json'
with open(filename, 'w') as f:
json.dump(username, f)
return username
# 2、获取用户信息
def get_stored_username():
filename = 'username.json'
try:
with open(filename) as f:
username = json.load(f)
except FileNotFoundError:
return None
else:
return username
# 3、显示欢迎界面
def greet_user():
username = get_stored_username()
if username:
print("Welcome back, {}!".format(username))
else:
get_new_username()
print("We'll remember you when you come back, {}!".format(username))
# 引导程序启动
greet_user()
if __name__ == '__main__':
main()
经过重构,我们的代码不仅满足了标准化的结构要求,整个主程序内,按照程序的三个主要动作,形成了三个函数,每一个函数都能够实现特定而清晰的目标。这时,整个程序的结构就更加的清晰了。
因为我们这个实例程序总体还是比较简单,所以区别可能并不明显,如果是一个大型程序,特别是由多个人共同完成的程序时,这种结构化的重构就变得非常重要了。
以上就是我们对于之前所学内容的一个简单的总结性应用,也通过一个应用实例体验了程序重构的过程。
至此,Python基础知识的主要部分就介绍得差不多了。下一篇,我们将会对之前学习的内容进行一个小结,通过结构化的方式,将这一阶段学习的内容再进行一次梳理和总结,敬请关注。
感谢阅读本文!如有任何问题,欢迎留言,一起交流讨论^_^
要阅读《手把手陪您学Python》系列文章的其他篇目,请关注公众号点击菜单选择,或点击下方链接直达。
《手把手陪您学Python》3——PyCharm的安装和配置
《手把手陪您学Python》5——Jupyter Notebook
For Fans:关注“亦说Python”公众号,回复“手37”,即可免费下载本篇文章所用示例语句。
