目录
第八章 python异常、模块与包
01 了解异常
什么是异常呢?我们经常说:程序员天天的工作就是打代码,修BUG,继续修BUG,而这里的BUG我们就可以说是"异常"。
BUG在微软翻译上是错误的意思,是指在软件运行中因为程序本身有错误而造成的功能不正常、死机、数据丢失、非正常中断等现象。
这还得说回1945年,计算机还是由机械式继电器和真空管驱动的,机器有房间那么大。体现当时技术水平的MarkⅡ,是由哈佛大学制造的一个庞然大物。当技术人员正在进行不整机运行时,它突然停止了工作。他们爬上去找原因,发现这台巨大的计算机内部一组继电器的触点之间有一只飞蛾,这显然是由于飞蛾受光和热的吸引,飞到了触点上,然后被高电压击死。史上的第一只 "Bug" ,真的是因为一只飞蛾意外走入一电脑而引致故障,因此Bug从原意为臭虫引申为程序错误。
与Bug相对应,人们将发现Bug并加以纠正的过程叫做“Debug”(中文称作“调试”),意即“捉虫子”或“杀虫子”。
02 异常的捕获方法
为什么我们要去捕获异常?
世界上不可能会有完美的程序,在B站上,有人会调侃"代码和我,只要有一个能跑起来就行""只要你的代码能跑起来,就不要去轻易的修改"。所以,我们要做的,不是力求程序的完美运行,而是要在力所能及的范围内,对可能出现的bug,进行提前准备、提前处理。这种行为,我们称之为:异常处理(捕获异常)。
当我们的程序遇到了bug,那么接下来会有两种情况
1.整个程序因为一个bug而停止运行
2.对bug进行提醒整个程序继续运行
显然在之前的学习中,我们所有的程序遇到bug就会出现1这样的情况,也就是整个程序直接崩溃。但是在真实的工作中,我们肯定不能因为一个小小的bug就让程序全部崩溃,也就是我们希望的是达到2这种情况。那这里我们就需要使用到:捕获异常。捕获异常的作用就在于提前假设某处会出现异常,做好提前准备,当真的出现异常的时候可以有后续手段。
如何捕获异常
1.捕获异常
基本语法
try:
可能会发生错误的代码
except:
如果出现异常执行的代码
演示
此时并未出现text.txt
运行
没报错,并且执行了except部分的代码
2.捕获指定异常
基本语法
try:
print(name)
except NameError as e: #e是别名,随意定义
print('name变量名称为定义错误')
#注意:1.如果尝试执行的代码的异常类型和要补货的异常类型不一致,则无法捕获异常。
2.一般try下方只放一行尝试执行的代码。
3.捕获多个异常
基本语法
try:
print(1/0)
except (NameError,ZeroDivisionError):
print('name变量名称为定义错误')
4.捕获全部异常
语法:
try:
可能会发生错误的代码
except:
如果出现异常执行的代码
你可能会感觉到疑惑,这不是最开始、最简单的异常捕获方法吗,怎么就能够捕获所有异常?但是你仔细想一下,一开始的捕获异常并没有对异常类型作出限定,我们变相理解一下,是不是就是能捕获任意类型的异常,也就是这么演示的:
可以看到,无论是语法捕获还是数学异常都会被捕获到 。
还有一种语法可以捕获到全部的异常
try:
可能会发生错误的代码
except Exception as e:
如果出现异常执行的代码
两者作用相同,这里就不再做演示。在实际应用中,我们更加推荐第一种语法,因为更加简便且效果大差不差。
5.异常else语句
else表示的是如果没有异常发生时要去执行的代码。
try:
print(1)
except Exception as e:
print(e)
else:
print("我是else,是没有异常时执行的代码")
6.异常finally语句
finally表示的是,无论是否异常都要去执行的代码,例如关闭文件。
try:
f = open('test.txt','r')
except:
f = open('test.txt','w')
else:
print("没有异常,睡去吧")
finally:
f.close()
03 异常的传递性
异常是具有传递性的,当函数A中发生异常,并且没有捕获处理这个异常的时候,异常会传递到使用A函数的B函数中,当B函数也没有捕获处理这个异常的时候,异常会传递到使用B函数的main函数中,当main函数执行时,main函数就会捕获这个异常,这就是异常的传递性。
#注意:当所有函数都没有捕获处理这个异常时,那么程序就会进行报错。
04 Python模块
什么是模块
Python模块(Module),是一个Python文件,以.py结尾。模块能定义函数,模块里也能包含可执行的代码。
模块的作用:Python中有许多各种不同的模块,每一个缪哎都可以帮助我们快速的实现一些功能,比如实现和时间相关的功能就可以使用time模块。我们可以认为一个模块就是一个工具包,每一个工具包中都用有各种不同的工具供我们使用进而实现各种不同的功能。
模块的导入
方式:[from 模块名] import [模块 | 类 | 变量 | 函数 | *][as 别名]
注意:加入中括号为可选的意思,可以写也可以不写。*表示导入模块内全部的内容。
常用的组合形式有:
1.import 模块名
语法:
import 模块名
import 模块1,模块2
功能:导入某个模块,其中的所有功能任意使用
2. from 模块名 import 类、变量、方法等
语法:
from 模块名 import 功能名
功能名()
功能:仅使用某个模块中的某个功能或引用某个方法、类等。
那么上述的代码就能这样表示
3. from 模块名 import *
语法:
from 模块名 import *
功能名()
功能:指将某个模块中的所有功能全部导入,与上文第一种方法功能一致,仅写法有区别。
4.模块定义别名
语法:import 模块名 as 别名
5. 功能定义别名
语法:from 模块名 import 功能名 as 别名
自定义模块
具体如何自定义?
与我们正常创建文件相同,只需要在Python文件中定义好函数,在需要引用的文件中利用import或是from引用就可以了。
#注意:1.每个Python文件都可以作为一个模块,模块的名字就是文件的名字,也就是说自定义模块名必须要符合标识符命名规则。
2.同时导入多个模块且模块内有同名功能,当调用这个同名功能的时候,后调入的功能会直接将先一步调入的功能直接覆盖掉,最后调用到的是后面导入的模块的功能。
__main__变量
语法:if __main__ == "__main__"
作用:只有当程序是直接执行时才会进入if内部,如果是被导入的,if无法进入
__all__变量
作用:控制"from xxx import"时那些功能可以导入,如果一个模块文件有__all__变量,当使用'from xxx import *'导入时,只能导入这个列表中的元素。
语法:__all__ = [指定函数名]
05 Python包
什么是Python包
基于Python模块,我们可以在编写代码的时候导入许多外部的代码来丰富功能。但是如果导入的模块太多,就可能造成一定的混乱,那么如何进行管理呢?
从物理上看,包就是一个文件夹,在该文件夹下包含了一个 __init__. py 文件,这个文件可以为空,但必须存在。该文件夹可用于包含多个模块文件。
从逻辑上看,包的本质依然是模块。是将将各个包结合在多个模块下组成一个Python包。
包的作用:当我们的模块文件越来越多时,包可以帮助我们管理这些模块。包的作用就是包含多个模块,但包的本质依然是模块。
如何自定义包
快速入门,步骤如下:
1.新建包'my_package'
2. 新建包内模块'my_module'
Pyhcharm中的基本步骤
[New] -> [Python Package] -> 输入包名 -> 新建功能模块(有联系的模块)
#注意:新建包括包内部会自动创建 __init__. py 文件,这个文件控制着包的导入行为。
导入包的方式
1.import 包名. 模块名
包名. 模块名. 功能
通过上述的方式,包就被导入成功了
2.from 包名 import 模块
模块. 功能
3. from 包名. 模块 import 功能
功能
4. from 包名 import *
模块名. 功能
#注意:必须在 '__init__. py' 文件中添加 '__all__ = [ 模块名 ]' 控制允许导入的模块列表。并且 __all__ 针对的是 'from... import *' 这种方式,对 'import xxx' 这种无效。
06 安装第三方Python包
什么是第三方Python包?
我们知道,包可以包含一堆的python模块,而每个模块又包含许多的功能。所以,我们可以认为:一个包,就是一堆同类型功能的集合体。
在python程序的生态中,有许多的第三方python包可以极大的帮助我们提高开发效率。如:科学计算中常用的numpy包;数据分析中常用的pandas包;大数据计算中常用的pyspark、apache-flink包;图形可视化常用的matplotlib、pyecharts;人工智能常用的tensorflow等等。
这些都是第三方包,极大的丰富了Python的生态,提高了开发效率。但是由于是第三方,Python内部没有内置,所以我们需要安装他们才可以导入使用。
如何去安装第三方包?
第三方包的安装十分简单,我们只需要使用Python内置的php程序即可。
1. pip安装
打开我们许久未见的命令提示符, 在里面输入: pip install 包名称,就可以通过网络快速安装第三方包。同样我们也可以应用这种方式打开pip:python.exe -m pip install 包名称
另外,我们还有一些常用的命令:
pip list 显示已安装包 pip uninstall 包名 卸载包
Ctrl + C 停止当前命令
pip网络优化
由于pip是直接通过国外的网站连接进行包的下载,所以有的时候下载速度会很慢。
我们运用以下命令让其连接国内的网站进行包的安装。
pip install -i https: //pypi.tuna.tsinghua.edu.cn/simple 包名称
https: //pypi.tuna.tsinghua.edu.cn/simple 是清华大学提供的网站, 可供pip程序下载第三方包。
下载成功提示
Installing collected packages: 包名
Successfully installed 包名-版本号
2.Pycharm安装第三方包