Python-异常、模块与包
一、了解异常
当检测到一个错误时,Python解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的异常,也是我们常说的BUG
二、异常的捕获方法
作用:提前假设某处要出现异常,做好提前准备,当真的出现异常的时候,可以有后续手段
基本语法:
try:可能要发生错误的代码 except:如果出现异常执行的代码
# 演示异常捕获
# E盘中没有abc.txt这个文件
try:file = open("E:/abc.txt", "r", encoding="UTF-8")
except:print("出现异常")
# 结果:控制台输出出现异常
捕获指定异常
try:print(name) except NameError as e:print("name变量名称未定义错误")
注:如果尝试执行的代码的异常类型和要捕获的异常类型不一致,则无法捕获异常
一般try下方只放一行尝试执行的代码
只负责出现NameError时,才执行
try:print(name)
except NameError as e:print("name变量名称未定义错误")
# 结果:name变量名称未定义错误
try:print(1/0)
except ZeroDivisionError as a:print(a)
# 结果:division by zero
捕获多个异常
要捕获多个异常的时候,可以把要捕获的异常类型的名字,放在except后,并使用元组的方式进行书写
try:print(1/0)print(name)
except (NameError,ZeroDivisionError):print("可能是ZeroDivisionError或NameError")
# 结果:可能是ZeroDivisionError或NameError
异常else
else表示没有时要执行的代码
try:print(1)
except Exception as e:print(e)
else:print("我是else,是没有异常的时候执行的代码")
"""
结果:1我是else,是没有异常的时候执行的代码
"""
异常的finally()
finally表示的是无论是否异常都要执行的代码,例如关闭文件
try:f=open('E:/test.txt','r')
except Exception as e:f=open('E:/test.txt','w')
else:print("没有异常真开心")
finally:f.close()
"""
结果:没有异常真开心
"""
三、异常的传递
异常是具有传递性的
代码如上图,当函数func01中发生异常,并且没有捕获处理这个异常的时候,异常会传递到函数func02.当func02也没有捕获处理这个异常的时候main函数会捕获这个异常,这就是异常的传递性
注:当所有函数都能没有捕获异常的时候,程序会报错
def func01():print("这是func01开始")num=1/0print("这是func01结束")
def func02():print("这是func02开始")func01()print("这是func02结束")
def main():try:func02()except Exception as e:print("出现错误",e)
main()
五、Python模块
Python模块(Model),是一个Python文件,以.py结尾。模块能定义函数,类和变量,模块里也能包含可执行的代码
模块的作用:Python中有很多各种不同的模块,每一个模块都可以帮助我们快速的实现一些功能,比如实现和时间相关的功能就可以哦使用time模块,我们可以认为一个模块就是一个工具包,每一个工具包中都有各种不同的工具供我们使用进而实现各种不同的功能
大白话:模块就是一个Python文件,里面有类、函数、变量等,我们可以拿过来用(导入模块去使用)
模块的导入方式
[from 模块名] import [模块 | 类 | 变量 | 函数 | *][ as 别名]
常见的组合形式:
- import 模块名
import 模块名 import 模块名1,模块名2 模块名.功能名
# 导入时间模块
import timeprint("开始")
# 让程序睡眠一秒(阻塞)
time.sleep(1)# 通过.就可以使用模块内部的全部功能(类、函数、变量)
print("结束")
"""
结果:开始(1秒后)结束
"""
- from 模块名 import 类、变量、方法等
from 模块名 import 功能名 功能名()
# 导入时间模块中的sleep方法
from time import sleepprint("开始")
# 让程序睡眠一秒(阻塞)
sleep(1)
print("结束")
"""
结果:开始(1秒后)结束
"""
- from 模块名 import *
# 使用*导入time模块的全部功能
# *表示全部的意思
from time import *
print("开始")
# 让程序睡眠一秒(阻塞)
sleep(1)
print("结束")
"""
结果:开始(1秒后)结束
"""
- import 模块名 as 别名
# 模块定义别名 import 模块名 as 别名# 功能定义别名 from 模块名 import 功能 as 别名
# 模块别名
import time as tttt.sleep(2)
print("Hello")
# 结果:2秒后输出Hello
- from 模块名 import 功能名 as 别名
# 功能别名
from time import sleep as slsl(2)
print("World")
# 结果:2秒后输出World
自定义模块
Python中已经帮我们实现了很多的模块,不过有时候我们需要一些个性化的模块,这时候就可以通过自定义模块,也就是自己制作一个模块
注意:每个Python文件都可以作为一个模块,魔魁哎的名字就是文件的名字,也就是说自定义模块名名必须要符合标识符命名规则
# my_model_1.py中的代码
def test(a,b):print(a+b)
# 调用时的代码# 导入自定义模块
# 1
import my_model_1
my_model_1.test(1,2)
# 结果:3# 2
from my_model_1 import test
test(2,3)
# 结果:5
注意事项: 1、当导入多个模块时,且模块内有同名功能,当调用这个同名功能的时候,调用的时后面导入的模块的功能
2、当模块本身已经添加了一些测试信息时,无论是在当前文件还是导入了该模块的文件,在运行的时候都会自动执行测试信息
-
__main__变量
在模块中将测试代码写在--main--函数中可以保证在当前文件运行时会运行测试代码,在导入该模块的文件中不会i运行测试代码
快捷输入:main
# my_model_1中代码def test(a,b):print(a+b)
if __name__ == '__main__':test(2,2)
# 运行结果:4
# 导入了该模块的文件from my_model_1 import test
# 结果:什么也没有输出
- __ all__变量
如果一个模块文件中有“__all__”变量,当使用“from xxx import *”导入时 ,只能导入这个元素中的元素
# my_model_1中代码__all__=['test1','test2']
def test1():print(1)
def test2():print(2)
def test3():print(3)
六、Python包
从物理上看,包就是一个文件夹,在该文件夹下包含了一个__init__.py文件,该文件夹可用于包含多个模块文件;从逻辑上看,包的本质是模块
包的作用:当我们的模块文件越来越多的时候,包可以帮助我们管理这些模块,报的作用就是包含多个模块,但包的本质依然是模块
新建包:
输入包名,鼠标左键ok,就新建了功能模块(有联系的模块)
注意:新建包后,包内部会自动创建“__init__.py”文件,这个文件控制着包的导入行为
导入包
# 方式1
import 包名.模块名
包名.模块名.目标
# 方式2
# 注意:必须在“__init__.py”文件中添加“__all__ = [ ]”,控制允许导入的模块列表
from 包名 import *
模块名.目标
七、安装第三方Python包
包可以包含一堆Python模块,而每个模块又内含许多功能,所以,我们可以认为一个包,就是一堆同类型功能的集合体
在Python程序的生态中,又许多的第三方包(非Python官方),可以帮助我们提高效率,例
- 科学计算中常用的:numpy包
- 数据分析中常用的:pandas包
- 大数据计算中常用的:pyspark、apache-flink包
- 图形可视化常用的:matplotlib、pyecharts
- 人工智能常用的:tensorflow
- 等等
我们可以通过安装后到使用
通过网络快速安装第三方包,我们需要打开命令提示符程序,输入:
pip install 包名称
由于pip连接的国外的网站下载,有时网速很慢,我们也可以使用国内的网站下载
pip install -i Simple Index 包名称
Simple Index 是清华大学提供的网站,可供pip程序下载
或者也可以在设置中查看,哪些下载了,哪些没下载
点击+号
这样下载使用的也是国外的网站,你也可以这样