《手把手陪您学Python》37——程序的重构

在上一篇《手把手陪您学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》1——为什么要学Python?

《手把手陪您学Python》2——Python的安装

《手把手陪您学Python》3——PyCharm的安装和配置

《手把手陪您学Python》4——Hello World!

《手把手陪您学Python》5——Jupyter Notebook

《手把手陪您学Python》6——字符串的标识

《手把手陪您学Python》7——字符串的索引

《手把手陪您学Python》8——字符串的切片

《手把手陪您学Python》9——字符串的运算

《手把手陪您学Python》10——字符串的函数

《手把手陪您学Python》11——字符串的格式化输出

《手把手陪您学Python》12——数字

《手把手陪您学Python》13——运算

《手把手陪您学Python》14——交互式输入

《手把手陪您学Python》15——判断语句if

《手把手陪您学Python》16——循环语句while

《手把手陪您学Python》17——循环的终止

《手把手陪您学Python》18——循环语句for

《手把手陪您学Python》19——第一阶段小结

《手把手陪您学Python》20——列表

《手把手陪您学Python》21——元组

《手把手陪您学Python》22——字典

《手把手陪您学Python》23——内置序列函数

《手把手陪您学Python》24——集合

《手把手陪您学Python》25——列表推导式

《手把手陪您学Python》26——自定义函数

《手把手陪您学Python》27——自定义函数的参数

《手把手陪您学Python》28——自定义函数的返回值

《手把手陪您学Python》29——匿名函数

《手把手陪您学Python》30——模块

《手把手陪您学Python》31——文件的打开

《手把手陪您学Python》32——文件的读取

《手把手陪您学Python》33——文件的关闭

《手把手陪您学Python》34——文件的写入

《手把手陪您学Python》35——数据的存储

《手把手陪您学Python》36——错误和异常处理

For Fans:关注“亦说Python”公众号,回复“手37”,即可免费下载本篇文章所用示例语句。

亦说Python——Python爱好者的学习分享园地

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值