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
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 = None
try:
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") # 测试存在的文件