Python系列课(8)——异常、模块与包
·
目录
一、了解异常
异常:程序运行过程中出现的错误(BUG)
# 异常演示:以r模式打开不存在的文件
# f = open("linux.txt", "r") # 报错:FileNotFoundError
二、异常的捕获方法
1. 基本语法(捕获所有异常)
try:
# 可能发生错误的代码
f = open("linux.txt", "r")
except:
# 出现异常时执行的代码
f = open("linux.txt", "w")
print("文件不存在,已创建新文件")
# 输出:文件不存在,已创建新文件
2. 捕获指定异常
try:
print(name) # name未定义
except NameError as e:
print(f"捕获到异常:{e}")
# 输出:捕获到异常:name 'name' is not defined
# 捕获异常类型不匹配时,无法捕获
try:
print(1 / 0) # ZeroDivisionError
except NameError as e:
print("NameError异常") # 不会执行
# 程序会直接报错
3. 捕获多个异常
try:
print(1 / 0)
except (NameError, ZeroDivisionError) as e:
print(f"捕获到异常:{e}")
# 输出:捕获到异常:division by zero
4. 捕获所有异常(推荐)
try:
print(name)
except Exception as e:
print(f"捕获到异常:{e}")
# 输出:捕获到异常:name 'name' is not defined
5. else 和 finally
# else:没有异常时执行
try:
print("正常代码")
except Exception as e:
print(f"异常:{e}")
else:
print("没有异常,执行else")
# 输出:
# 正常代码
# 没有异常,执行else
# finally:无论是否有异常都执行
try:
f = open("test.txt", "r")
except Exception as e:
f = open("test.txt", "w")
print("文件不存在,已创建")
else:
print("文件打开成功")
finally:
f.close()
print("文件已关闭")
# 输出(如果test.txt不存在):
# 文件不存在,已创建
# 文件已关闭
三、异常的传递性
异常会沿着函数调用链向上传递
def func1():
print("func1开始")
print(1 / 0) # 发生异常
print("func1结束")
def func2():
print("func2开始")
func1()
print("func2结束")
def main():
try:
func2()
except Exception as e:
print(f"在main中捕获到异常:{e}")
main()
# 输出:
# func2开始
# func1开始
# 在main中捕获到异常:division by zero
四、Python模块
1. 模块的导入方式
| 导入方式 | 语法 | 调用方式 |
|---|---|---|
| 导入整个模块 | import 模块名 |
模块名.功能名() |
| 导入特定功能 | from 模块名 import 功能名 |
功能名() |
| 导入所有功能 | from 模块名 import * |
功能名() |
| 模块别名 | import 模块名 as 别名 |
别名.功能名() |
| 功能别名 | from 模块名 import 功能 as 别名 |
别名() |
2. 导入示例
# 方式1:import 模块名
import time
print("开始")
time.sleep(1) # 需要模块名.功能名
print("结束")
# 输出:开始(等待1秒)结束
# 方式2:from 模块名 import 功能名
from time import sleep
print("开始")
sleep(1) # 直接使用功能名
print("结束")
# 方式3:from 模块名 import *
from time import *
print("开始")
sleep(1)
print("结束")
# 方式4:模块别名
import time as t
print("开始")
t.sleep(1)
print("结束")
# 方式5:功能别名
from time import sleep as sl
print("开始")
sl(1)
print("结束")
3. 自定义模块
创建 my_module.py:
def test(a, b):
print(a + b)
def hello(name):
print(f"你好,{name}")
使用自定义模块:
# 导入自定义模块
import my_module
my_module.test(3, 5) # 8
my_module.hello("张三") # 你好,张三
4. __main__ 变量的使用
# my_module.py
def test(a, b):
print(a + b)
# 只在当前文件直接运行时执行,被导入时不执行
if __name__ == '__main__':
test(1, 1) # 直接运行时输出2,被导入时不执行
5. __all__ 变量
# my_module.py
__all__ = ['test'] # 只允许导入test
def test(a, b):
print(a + b)
def hello(name):
print(f"你好,{name}")
# 使用 from xxx import * 时,只能导入__all__列表中的功能
from my_module import *
test(3, 5) # 8(可以)
# hello("张三") # 报错,hello不在__all__中
6. 注意事项
# 后导入的模块会覆盖先导入的同名功能 from module1 import test # test出1 from module2 import test # test出2 test() # 执行的是module2中的test
五、Python包
1. 什么是包
包:一个包含 __init__.py 文件的文件夹,用于管理多个模块
my_package/ # 包名
__init__.py # 包标识文件
module1.py # 模块1
module2.py # 模块2
2. 导入包的方式
方式1:import 包名.模块名
import my_package.my_module1 my_package.my_module1.test(1, 2)
方式2:from 包名 import 模块名
from my_package import my_module1 my_module1.test(1, 2)
方式3:from 包名.模块名 import 功能名
from my_package.my_module1 import test test(1, 2)
方式4:from 包名 import *(需要在 __init__.py 中定义 __all__)
# __init__.py __all__ = ['my_module1', 'my_module2']
from my_package import *
my_module1.test(1, 2)
my_module2.hello("张三")
六、安装第三方包
1. 使用pip安装
# 基本安装 pip install 包名 # 使用清华镜像源安装(更快) pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名 # 示例:安装numpy pip install numpy
2. 在PyCharm中安装
-
File → Settings → Project → Python Interpreter
-
点击"+"号搜索并安装
七、综合案例:自定义工具包
项目结构
my_utils/ # 工具包
__init__.py
str_util.py # 字符串工具
file_util.py # 文件工具
1. str_util.py(字符串工具)
def str_reverse(s):
"""
字符串反转
:param s: 输入字符串
:return: 反转后的字符串
"""
return s[::-1]
def substr(s, x, y):
"""
字符串切片
:param s: 输入字符串
:param x: 起始下标
:param y: 结束下标
:return: 切片后的字符串
"""
return s[x:y]
# 测试代码
if __name__ == '__main__':
print(str_reverse("hello")) # olleh
print(substr("hello", 1, 4)) # ell
2. file_util.py(文件工具)
def print_file_info(file_name):
"""
打印文件内容
:param file_name: 文件路径
:return: None
"""
f = None
try:
f = open(file_name, "r", encoding="UTF-8")
content = f.read()
print("文件内容:")
print(content)
except FileNotFoundError:
print(f"错误:文件'{file_name}'不存在")
except Exception as e:
print(f"发生未知错误:{e}")
finally:
if f:
f.close()
print("文件已关闭")
def append_to_file(file_name, data):
"""
追加数据到文件
:param file_name: 文件路径
:param data: 要追加的数据
:return: None
"""
try:
with open(file_name, "a", encoding="UTF-8") as f:
f.write(data)
print(f"数据已追加到'{file_name}'")
except Exception as e:
print(f"追加失败:{e}")
# 测试代码
if __name__ == '__main__':
# 测试打印文件内容
print_file_info("test.txt")
# 测试追加内容
append_to_file("test.txt", "\n新的一行内容")
3. init.py
__all__ = ['str_util', 'file_util']
4. 使用工具包
# 方式1:导入整个模块
import my_utils.str_util
import my_utils.file_util
print(my_utils.str_util.str_reverse("Python")) # nohtyP
my_utils.file_util.append_to_file("log.txt", "2024-01-01 日志信息\n")
# 方式2:导入具体功能
from my_utils.str_util import str_reverse, substr
from my_utils.file_util import print_file_info
print(str_reverse("hello")) # olleh
print(substr("hello", 1, 4)) # ell
# 方式3:导入所有(需要__all__)
from my_utils import *
print(str_util.str_reverse("world")) # dlrow
八、异常、模块与包速查表
异常捕获
| 语法 | 说明 |
|---|---|
try: ... except: ... |
捕获所有异常 |
except 异常类型 as e: |
捕获指定异常 |
except (类型1, 类型2): |
捕获多个异常 |
except Exception as e: |
捕获所有异常(推荐) |
else: |
无异常时执行 |
finally: |
无论是否异常都执行 |
模块导入
| 语法 | 说明 |
|---|---|
import 模块 |
导入整个模块 |
from 模块 import 功能 |
导入特定功能 |
from 模块 import * |
导入所有功能 |
import 模块 as 别名 |
模块别名 |
from 模块 import 功能 as 别名 |
功能别名 |
包相关
| 概念 | 说明 |
|---|---|
| 包 | 包含 __init__.py 的文件夹 |
__init__.py |
标识文件夹为包 |
__all__ |
控制 import * 的内容 |
__name__ |
"__main__" 表示直接运行 |
第三方包安装
# 基本安装 pip install 包名 # 使用清华镜像源 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名 # 查看已安装包 pip list # 卸载包 pip uninstall 包名
更多推荐

所有评论(0)