文章目录
- 了解异常
- 异常的捕获方法
- 为什么需要捕获异常
- 捕获常规的异常
- 捕获指定的异常
- 捕获多个异常
- 捕获所有的异常
- 异常else
- 异常的finally
- 异常的传递
- Python模块
- 模块的导入
- 自定义模块
- 测试模块
- \_all\_模块
- Python包
了解异常
当我们的解释器运行时发生了一些没办法的操作,或者说bug,这就叫做异常。
异常的捕获方法
为什么需要捕获异常
在真实的工作生活中,我们所有的程序遇到BUG肯定不可能让他直接崩溃,也就是我们更希望遇到BUG可以做到对BUG进行提醒,然后让整个程序继续运行的这种情况,这就需要我们进行捕获异常。
捕获异常:提前假设某处会出现异常,做好提前准备,当真的异常出现的时候,就可以有后续的手段。
捕获常规的异常
基本语法:
try:
可能发生异常的代码
except:
如果出现异常执行的代码
样例:
try:
f=open('python.txt','r',encoding="UTF-8")
except:
f=open('python.txt','w',encoding="UTF-8")
显然当python.txt这个文件不存在的时候,就会发生异常,因为r的模式没办法新建一个文档,而调用w的话就可以解决异常。
捕获指定的异常
基本语法:
try:
出现的异常的代码
except 异常的类型 as 异常对象的变量:
如果出现异常执行的代码
样例:
try :
print(name)
except NameError as e:
print("出现了名字未定义的异常")
print(e)
输出结果:
值得注意的是,每种异常都有其对应的名字,这种方法仅仅智能捕获对应的相对应的异常。
而e其实上就是对象,也就是异常的对象,这个后续会再进行讲解。
捕获多个异常
基本语法:
try:
出现的异常的代码
except (异常的类型1,异常的类型2) as 异常对象的变量:
如果出现异常执行的代码
样例:
try :
print(1/0)
print(name)
except (NameError,ZeroDivisionError) as e:
print("出现了名字未定义的异常或者除数为零的异常")
print(e)
输出结果:
值得注意的是,我们当检测到最上面的异常1/0的时候,就会直接跳到except当中,并不是等try内部的所有指令执行完。
捕获所有的异常
实际上第一种做法就是捕获所有的异常,但是下面还有一种做法也可以达到这一形式:
基本语法:
try:
出现的异常的代码
except Exception as 异常对象的变量:
如果出现异常执行的代码
样例:
try :
print(name)
print(1/0)
except Exception as e:
print("出现了异常")
print(e)
输出结果:
异常else
直接从样例中理解吧:
样例:
try :
print('hello world')
except Exception as e:
print("出现了异常")
else:
print('我是else,没有异常的时候执行我')
输出结果:
异常的finally
直接从样例中理解吧:
样例:
try :
print('hello world')
except Exception as e:
print("出现了异常")
else:
print('我是else,没有异常的时候执行我')
finally:
print("无论出没出现异常,我都要来执行,一般用于文件的关闭什么的")
输出结果:
异常的传递
异常是具有传递性的,我们拿一个样例进行分析:
def fun1() :
print('这是fun1的开始')
print(1/0)
print('这是fun1的结束')
def fun2() :
print('这是fun2的开始')
fun1()
print('这是fun2的结束')
def main() :
try:
fun2()
except Exception as e:
print(e)
main()
输出结果:
我们可以看出,实际上异常是出现在fun1当中的,但是确是我们在main函数当中找出的异常错误,所以异常是具有传递性的。
提示:当所有的函数都没有捕获异常,程序就会报错。
Python模块
Python模块,实际上就是一个Python文件,以.py进行结尾。模块能定义函数,类和变量,模块里面也能包含可执行的代码。
模块的作用:
Python当中有很多模块,每一个模块都可以帮助我们快速的实现一些功能,比如实现和时间相关的功能就可以使用time模块,我们可以认为一个模块就是一个工具包,每一个工具包中都有各种不同的工具,来给我们进行使用。
模块的导入
基本的语法:
[from 模块名] import [模块|类|变量|函数|*][as 别名]
(*表示导入模块内的全部内容)
常用的组合形式是:
-
import 模块名
-
from 模块名 import 类/对象/方法等
-
from 模块名 import *
-
import 模块名 as 别名
-
from 模块名 import 功能名(类/对象/方法) as 别名
-
样例:
import time
print('你好')
time.sleep(5)
print('再见')
输出结果:
会等待5秒,后续的不解释。
- 样例
from time import sleep
print('你好')
sleep(5)
print('再见')
值得注意的是,此时我们使用该方法就只需要使用其函数名即可,而不需要指出是哪一个模块里面的哪一个函数。
- 样例:
from time import *
print('你好')
sleep(5)
print('再见')
- 样例:
import time as tt
print('你好')
tt.sleep(5)
print('再见')
- 样例:
from time import sleep as sl
print('你好')
sl(5)
print('再见')
PS:值得注意的是模块的导入需要在开头的地方写。
自定义模块
实际上就是新建一个新的python文件,在内部定义相关函数,然后在你需要用到此函数的时候,你就可以import 该文件的名字,来引入该模块,从而使用其中的函数了,但值得注意的是文件命名规则也必须复合标识符的命名规则。
还有一点就是,我们在文件一种写了fun1,在文件2种写了fun1,然后在我们的主文件种用from 文件1 import fun1,和from 文件2 import fun1,两次调用同名文件,引入的函数就会是文件2当中的函数,实际上就是文件2当中引入的函数将文件1的函数覆盖了。
测试模块
在实际开发中,当一个开发人员写完一个模块后,为零让模块能够在项目中达到想要的效果,这个开发人员就会在这个py文件中添加上一些测试的信息。
格式:
if name == ‘main’:
def test (data1,data2):
print(data1+data2)
# 下面的仅在当前文件中使用,其他导入该文件模块的不使用
if __name__ == '__main__':
test(1,2)
_all_模块
基本语法:
all=[‘可以被外部引用的模块函数的名字’]
样例:
__all__=['test1']
def test1 (data1,data2):
print(data1+data2)
def test2(data1,data2):
print(data1-data2)
对应上面的这个文件中的函数来说,外部引用模块仅能引用test1函数,而不能引用test2的。(用*的方式,其他的和,all没关系,all仅针对于*)
Python包
包实际上就是一个文件夹,内部包含着 _init_.py的文件,和其他的py模块文件。包的本质还是模块。
而如果向引出包内所有模块函数,实际上就可以在_init_.py的文件中对于文件进行all约束。这里就不细讲了。
常见的第三方包:
科学计算中:numpy包
数据分析中常用的:pandas包
大数据计算中常用的:pyspark包、 apache-flink包
图形可视化常用:matplotlib包 、pyecharts包
人工智能常用: tensorflow包
等