Py 异常、模块与包
文章目录
一、异常
在我们写的程序中,因为语法、逻辑等原因,会出现错误,当检测到错误时,Python解释器就无法运行了,这个错误就是我们常说的BUG,也叫异常。
异常的捕获
当程序遇到BUG时,程序一般会直接停止运行,而当我们对异常进行捕获并作出相应的措施后,能够让程序继续运行,从而防止因为一个异常而导致程序崩溃。
即我们可以通过提前假设异常会出现的地方,对异常进行捕获并给出补救措施,保证程序的正常运行。
捕获常规异常
语法:
try:
可能出现异常的语句
except:
出现异常时进行的操作
示例:
# 基本捕获语法
try:
f = open("E:/Python/Data/20231107/test.txt", "r", encoding="UTF-8")
# 此时文件是不存在的,即无法以r模式打开文件
except:
f = open("E:/Python/Data/20231107/test.txt", "w", encoding="UTF-8")
# 出现异常(无论什么异常)时,except起作用
捕获指定类型的异常
语法:
try:
可能出现异常的语句
except 异常类型 as 变量名:
出现异常时进行的操作
# 可通过打印变量名输出异常类型
捕获多种类型的异常
可以通过在excep后面用元组的方式添加多个异常类型,进行对多种异常的捕获
语法:
try:
可能出现异常的操作
except(异常类型1,异常类型2, ...):
出现异常时进行的操作
捕获所有异常
语法:
try:
可能出现异常的操作
expect Exception as 变量名:
出现异常时进行的操作
Exception属于顶级异常,即捕获它相当于捕获所有异常
其实基础语法也可以
异常 else
else 表示没有异常时进行的操作
语法:
try:
可能出现异常的操作
except:
出现异常时进行的操作
else:
没有出现异常时进行的操作
异常finally
finally表示有没有异常都要进行的操作,比如关闭文件等
语法:
try:
可能出现异常的操作
except:
出现异常时进行的操作
else:
没有出现异常时进行的操作
finally:
有没有异常都进行的操作
异常的传递
异常是具有传递性的,可以在函数间传递,当所有函数都没有捕获异常的时候,程序就会报错
def func1():
print("func1 start")
num1 = 1 / 0
# 出现异常:0为分母
def func2():
print("func2 start")
func1()
# 异常传递到func2
def func3():
print("func3 start")
try:
func2()
# 异常传递到func3
# 这里如果不捕获异常,则整个程序会报错
except Exception as e:
print("error")
print(e)
func3()
# 输出func3 start
# func2 start
# func1 start
# error
# division by zero
二、模块
Python中的模块其实就是一个以.py结尾的python文件,里面可以定义函数、类和变量等
每一个模块就相当于一个工具箱,通过在程序中导入模块可以直接调用模块中的类、函数等
模块的导入
语法:
[from 模块名] import [模块|类|变量|函数|*] [as 别名]
[]中的为可选项
import导入模块
语法:
语法1: import 模块名
语法2: import 模块1, 模块2
示例:
import time
time.sleep(5)
(在pycharm中,导入模块后,按住ctrl左键点击模块名可以打开模块对应文件)
通过. 可以使用模块内的全部功能(类、函数、变量)
from 模块名 import 功能名
语法:
from 模块名 import 功能名
示例:
from time import sleep
sleep(5)
只导入某个功能,此时可以直接写方法名,不用加.
from 模块名 import *
可以导入模块中的所有方法
as定义导入的模块的别名
import 模块名 as 别名
from 模块名 import 功能名 as 别名
可以将导入的模块、功能进行重命名,方便使用
自定义模块
除了Python中已经有的模块,我们可以根据自己的需求定义自己的模块
每一个Python文件都可以作为一个模块,模块的名字就是文件名(不包括.py后缀)
# 新建一个名为my_mode的.py文件,放入下面的代码
def test(a, b):
return a + b
# 在原文件中调用my_mode
import my_mode
ret = my_mode.test(1, 2)
print(ret)
# 输出3
注意:当导入多个模块,且有多个模块中具有相同的功能名,当调用这个功能的时候,会调用后面导入的模块的功能
from my_mode import test
from my_mode2 import test
# 在pycharm中,写入下面这行代码是,第二行导入代码会亮起,即它被使用了
ret = test(1, 2)
print(ret)
# my_mode内的代码
def test(a, b):
return a + b
# my_mode2内的代码
def test(a, b):
return a - b
# 输出 -1
测试模块
当我们在制作模块时,常常需要对模块的功能进行测试,例如:
def func1():
print(1 + 2)
func1()
如果在导入模块是保持这样的写法,那么在导入模块时,函数func1会直接执行一次,对程序造成影响
解决方法:
- 将用于测试的代码删除
- 通过添加特殊语句,使得测试代码只在测试时被调用
语法:
if__name__ == '__main__':
需要执行的语句
def test(a, b):
return a + b
if __name__ == '__main__':
# __name__ 是一个内置变量,当程序运行时,__name__会被命名为__main__
# 而当mode被导入是,__name__则不会被命名为__main__
test(1, 2)
__all__
如果一个模块中有 __all__ 变量,当我们使用 from 模块名 import * 导入模块时,将只能导入这个列表中的元素
语法:
__all__ = [功能1, 功能2, ...]
三、包
Python包就是一个包含有 __init__.py文件的特殊文件夹,可以包含有多个模块,有利于对模块的管理
(如果没有__init__.py 文件,就是个普通文件夹)
自定义包
在pycharm中,右键项目所在的文件夹,选择新建 Python Package (汉化插件下显示为:Python 软件包)
然后将模块放入包,或在包内创建模块即可
导入包
语法:
语法1:
import 包名.模块名
调用语法:包名.模块名.功能名
语法2:
from 包名 import 模块名
调用语法:模块名.功能名
语法3:
from 包名 import *
注意:此时需要在__init__.py文件中添加语句'__all__' = [模块1, 模块2, ...]用于控制允许导入的模块
调用语法:模块名.功能名
安装第三方包
在Python的生态中,有许多第三方(非Python官方)包,如pandas、numpy等,可用于帮助我们提高开发效率
通过pip安装第三方包
打开cmd,输入 pip install 包名
由于通过pip直接安装第三方包是通过官方网站进行下载,访问较慢,因此我们可以通过清华大学的一个镜像站进行下载(pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名称)
通过PyCharm安装第三方包
点击右下角的Python版本,点击“解释器设置”(汉化环境下),点击+号即可搜索并安装需要的包(可在“选项”中添加镜像源(-i https://pypi.tuna.tsinghua.edu.cn/simple)更改下载地址)