异常
在程序运行时,不可避免的会出现一些错误,在Python中一旦出现异常会停止执行之后的代码,Python希望在出现异常是,我们能及时处理。
异常有时候是因为开发失误造成的,这时候我们可以通过修改源码,来修复bug,但有时异常可能是用户的一些非法操作造成的,这时候我们就需要来处理异常了。
异常相当于一个类,所有异常都有有一个exception的父类。异常出现的时候其实就相当于程序抛出了异常这个类。
处理异常
有时候,我们希望及时发生异常,程序还是能照常执行下去,这时候我们就要用到try。
try语句
语法:
try: # 用来判断是否会出错的语句
pass
except 异常类型: # 如果报错则输出的内容
pass
except 异常类型: # 如果报错则输出的内容
pass
except 异常类型: # 如果报错则输出的内容
pass
...
else: # 如果没有报错则输出的内容
pass
finally: # 无论有没有异常都会执行
pass
我们可以将可能出现异常的内容放在try中,让程序进行判断,如果出现异常则会输出except中的内容,程序不会就此终止,而是会继续运行下去。
try:
a = 6
b = '66'
c = a + b
except:
print('程序报错啦')
# 程序会输出‘程序保存啦’
except虽然后面可以不更任何东西,但PEP8并不推荐这样做,因为这时候会将所以报错类型都执行同样的替代结果。我们最好指定一下需要except进行处理的报错类型。
a = 6
b = '66'
try:
c = a + b
except TypeError:
print(f'{type(a)}类型和{type(b)}类型不能执行运算')
这样做的好处是可以让人更清楚异常是什么导致的,以便之后的处理。
except类似于elif,可以重复使用。
但如果我们并不清楚会出现异常是那些,我们可以在Exception后添加Exception,这个所有异常的父类。添加了exception后我们可以通过它读取到异常信息。
语法中还有一个else和finally的参数,这两个参数在于程序没有报错时执行和程序不管报不报错都会执行。
异常的传播
如果异常出现在某个没有被调用的函数或方法中,异常不会传播。一旦调用异常会进行传播。
异常会传播到所有调用过异常的地方,但究其根本只是异常发生的地方出现了错误,其余地方并不需要管,只需根治根源即可解决所有异常。
自定义异常
在一些特定的时候,我们需要自定义一些异常用来提示其他人错误的原因,这时候就需要raise函数
如果你不想使用以及定义好的异常,我们可以自定义一个新的异常,定义异常相当于创建一个父类为Exception的类
自己定义异常的情况一般会在制作模块的时候使用,这种方法可以引导使用者正确的使用你定义的模块
模块
模块化:将一个完整的程序分解成一个一个小模块,通过将模块的组合,来搭建出一个完整的程序,让搭建程序的过程就类似于搭积木。
模块化的优点
- 方便开发
模块化开发方便多人团队合作开发,可以多个人同时进行制作模块,最终再将模块拼装成完整的程序,满足了高效快捷的开发需要。 - 方便维护
当程序出问题的时候可以快速定位到是哪个模块导致的,然后可以只对此模块进行修复,降低后期维护成本。 - 方便复用
模块对复用有着良好的支持,一次开发处处可用,Python中的pip这个包管理器就是用来下载个个打包好的模块,通过pip我们可以快速使用他人写好的模块。
模块的使用
创建模块
在Python中,每个py文都就是模块,创建py文件就相当于创建模块
引入模块
模块的引入可以在程序中任意位置进行,但一般都会在程序开始的位置引入,这不仅符合大多数开发者的习惯,而且方便于查找引用了那些模块。
-
使用import引入
语法:import 模块名 或 import 模块名 as 别名
模块名就是Python的文件名,我们可以给模块名起一个别名,方便我们记忆和调用。
调用:== 模块名.函数(类、变量)== -
使用from引入
当我们只需要模块中莫个功能而不是全部功能时,这时候可以通过from来调用莫个功能即可,减少内存的使用可以加快程序的速度。
语法: from 模块名 import 变量、变量(函数、对象)…
如果使用from 模块名 import *,可引用全部内容。
调用:变量(函数、对象)
使用from同样可以在每个变量后加入as添加别名。 -
用import 模块名和from 模块名 import *区别
使用import的时候调用模块时需要添加模块名,相当于把模块以一个类的方式添加到了我们的代码中,使用from添加的调用时直接写添加的变量即可,相当于把模块中的代码直接复制到了我们的代码当中。
import这样的方法好处就是如果模块中有的对象,我们也有时,不会被覆盖,而from就会被覆盖。
a = '我是变量a'
# text中有一行代码是:a = '外部模块中的a'
from text import *
import text
print(a)
这里使用from调用后 a输出为外部模块中的a,使用import调用后,输出为我是变量a。
调用模块
调用模块的时候类似于使用类的实例的方法。
访问模块中的变量、函数或对象。
语法:模块名.变量名(函数名、对象名)
__name__
这是每个模块中都会含有的魔术方法,这个方法用来返回模块名,但如果在主模块使用__name__则会返回__main__。
import text
data = __name__
print(f'模块中输出__name__的结果为:{text.data},主函数输出的结果为:{data}')
# 模块中输出__name__的结果为:text,主函数输出的结果为:__main__
通过这个特性,我们可以做一个if判断,让模块中的代码只会在主模块中运行。
if __name__ == '__main__':
标准库(内置模块)
当我们在计算机中安装Python时,Python会自带一些扩展的工具,这些扩展工具就是我们所说的标准库。
我们常用的datetime()random()os()等都属于内置模块,内置模块种类众多,我们就不在这里赘述了如果有需要可以自行查阅个模块的说明文档。Python3.8.0标准库文档