Python(9)-- 异常模块与包
1. 了解异常
异常:就是程序运行的过程中出现了错误
Bug:异常的意思,因为历史因为小虫子导致计算机失灵的案例,所以延续至今,bug就代表软件出现错误。
2. 异常的捕获方法
异常处理:在可能发生异常的地方,进行捕获。当异常出现的时候,提供解决方式,而不是任由其导致程序无法运行。
捕获异常的作用在于:提前假设某处会出现异常,做好提前准备,当真的出现异常的时候,可以有后续手段。
2.1 捕获异常语法:
2.2 捕获指定异常:
注意:
① 如果尝试执行的代码的异常类型和要捕获的异常类型不一致,则无法捕获异常。
② 一般try下方只放一行尝试执行的代码。
2.3 捕获多个异常
当捕获多个异常时,可以把要捕获的异常类型的名字,放到except 后,并使用元组的方式进行书写。
2.4 捕获异常并输出描述信息
2.5 异常else
else表示的是如果没有异常要执行的代码。
2.6 异常的finally
finally表示的是无论是否异常都要执行的代码,例如关闭文件。
2.7 捕获所有信息
3. 异常的传递
异常具有传递性。当所有函数都没有捕获异常的时候, 程序就会报错。
注:利用异常具有传递性的特点, 当我们想要保证程序不会因为异常崩溃的时候, 就可以在main函数中设置异常捕获, 由于无论在整个程序哪里发生异常, 最终都 会传递到main函数中, 这样就可以确保所有的异常都会被捕获
4. Python模块
4.1 模块的导入
模块:就是一个Python代码文件,内含类、函数、变量等,我们可以导入进行使用。
模块导入的语法如下:
常用的组合形式如:
- import 模块名
- from 模块名 import 类、变量、方法等
- from 模块名 import *
- import 模块名 as 别名
- from 模块名 import 功能名 as 别名
注意:
from可以省略,直接import即可
as别名可以省略
通过”.”来确定层级关系
模块的导入一般写在代码文件的开头位置
4.2 自定义模块
自定义模块名必须要符合标识符命名规则
自定义模块并导入: 在Python代码文件中正常写代码即可,通过import、from关键字和导入Python内置模块一样导入即可使用。
if __main__ == “__main__”表示,只有当程序是直接执行的才会进入if内部,如果是被导入的,则if无法进入
注意:
不同模块,同名的功能,如果都被导入,那么后导入的会覆盖先导入的
__all__变量可以控制import *的时候哪些功能可以被导入
5. Python包
5.1 自定义包:
从物理上看,包就是一个文件夹,在该文件夹下包含了一个 __init__.py 文件,该文件夹可用于包含多个模块文件
从逻辑上看,包的本质依然是模块
__init__.py文件:创建包会默认自动创建的文件,通过这个文件来表示一个文件夹是Python的包,而非普通的文件夹。
__all__变量的作用: 同模块中学习到的是一个作用,控制 import * 能够导入的内容
导入包:
注意:必须在`__init__.py`文件中添加`__all__ = []`,控制允许导入的模块列表
5.2 安装第三方包:
- 科学计算中常用的:numpy包
- 数据分析中常用的:pandas包
- 大数据计算中常用的:pyspark、apache-flink包
- 图形可视化常用的:matplotlib、pyecharts
- 人工智能常用的:tensorflow
pip install 包名称
pip install -i
https://pypi.tuna.tsinghua.edu.cn/simple 包名称
6. 综合案例
创建一个自定义包,名称为:my_utils (我的工具)
在包内提供2个模块 s
tr_util.py (字符串相关工具,内含:)
- 函数:str_reverse(s),接受传入字符串,将字符串反转返回
- 函数:substr(s, x, y),按照下标x和y,对字符串进行切片
file_util.py(文件处理相关工具,内含:)
- 函数:print_file_info(file_name),接收传入文件的路径,打印文件的全部内容,如文件不存在则捕获异常,输出提示信息,通过finally关闭文件对象
- 函数:append_to_file(file_name, data),接收文件路径以及传入数据,将数据追加写入到文件中
str_util.py:
def str_reverse(s):"""将字符串反转返回:param s: 要反转的字符串:return: 反转后的字符串"""return s[::-1]def substr(s, x, y):"""按照下标x和y对字符串切片:param s: 原始字符串:param x: 起始索引:param y: 结束索引:return: 切片后的字符串"""return s[x:y]
file_util.py:
def print_file_info(file_name):"""打印文件内容:param file_name: 文件路径"""f = Nonetry:f = open(file_name, 'r', encoding='utf-8')content = f.read()print("文件内容:")print(content)except Exception as e:print(f"文件不存在或读取错误:{e}")finally:if f: # 如果文件对象存在f.close()def append_to_file(file_name, data):"""追加数据到文件:param file_name: 文件路径:param data: 要追加的数据"""with open(file_name, 'a', encoding='utf-8') as f:f.write(data)print("数据追加成功!")
__init__.py
from .str_util import str_reverse, substr
from .file_util import print_file_info, append_to_file__all__ = ['str_reverse', 'substr', 'print_file_info', 'append_to_file']
main
from my_utils import str_util, file_util# 测试字符串工具
print("字符串反转:", str_util.str_reverse("Python"))
print("字符串切片:", str_util.substr("Hello World", 2, 7))# 测试文件工具
file_util.print_file_info("test.txt") # 测试不存在的文件
file_util.append_to_file("test.txt", "这是追加的内容\n")
file_util.print_file_info("test.txt") # 测试存在的文件