当前位置: 首页 > news >正文

【Python】Python异常、模块与包

Python异常、模块与包

文章目录

      • Python异常、模块与包
    • @[toc]
        • 1.异常的概念
        • 2.异常的捕获
        • 3.Python自带模块
        • 4.Python自定义模块
        • 5.Python包
        • 6.综合案例

1.异常的概念
  • 定义:就是BUG,即程序错误,BUG这一词源于一只飞蛾引发的计算机故障

2.异常的捕获

当程序遇到BUG的时候,有两种情况:直接停止运行;对BUG进行提醒,整个程序继续运行

  • 异常捕获的作用:提前假设某处会出现异常,做好提前准备,当真出现异常的时候,可以有后续手段,基本格式如下:
'''
try:可能发生错误的代码
except:如果出现异常执行的代码
'''# 举例:以只读模式打开一个不存在的文件,可以知道会报错;如果出现报错,那么执行写入模式
try:f = open("D:/learing.txt", "r", encoding="UTF-8")
except:print("代码有问题,执行except下语句")f = open("D:/pythonlearing.txt", "w", encoding="UTF-8")# 输出结果
'''
代码有问题,执行except下语句
'''

可以捕获所有异常。

  • **捕获单个指定异常:**基本格式如下:
'''
try:可能发生错误的代码
except 具体错误类型 as e:    # 只捕捉上面的的错误类型,对于其它错误不捕捉语句                   # 有错误就执行这条语句
'''try:print(name)
except NameError as e:print("是代码有问题,执行except下语句")print(1)try:print(name)
except NameError as e:print("是代码有问题,执行except下语句")print(e)try:a = 1 / 0
except NameError as e:print("是代码有问题,执行except下语句")print(1)# 输出结果
'''
Traceback (most recent call last):File "C:\Users\Administrator\Desktop\pythonProject\main.py", line 22, in <module>a = 1 / 0~~^~~
ZeroDivisionError: division by zero
是代码有问题,执行except下语句
1
是代码有问题,执行except下语句
name 'name' is not defined
'''
  • 捕获多个指定异常:基本格式如下:
'''
try:可能发生错误的代码
except (错误类型1, 错误类型2) as e:   # 只捕捉上面两个错误类型,对于其它错误不捕捉语句                            # 有错误就执行这条语句
'''try:a = 1 / 0
except (NameError, ZeroDivisionError) as e:print("是代码有问题,执行except下语句")print(1)print(e)# 输出结果
'''
是代码有问题,执行except下语句
1
division by zero
'''
  • 捕获所有异常:基本格式如下:
'''
try:可能发生错误的代码
except Exception as e:   # 捕捉所有错误类型语句                 # 有错误就执行这条语句
'''try:f = open("D:/3.txt", "r")a = 3 / 0
except Exception as e:print("代码有问题,执行except下语句")print(1)# 输出结果
'''
代码有问题,执行except下语句
1
'''
  • 异常的else语句:基本格式如下:
'''
try:可能发生错误的代码
except Exception as e:语句         # 捕捉所有错误类型
else:语句         # 没有错误就执行该语句
'''try:a = 0 / 3
except Exception as e:print("代码有问题,执行except下语句")print(1)
else:print("没有错误")# 输出结果
'''
没有错误
'''
  • 异常的finally语句:基本格式如下:
'''
try:可能发生错误的代码
except Exception as e:   # 捕捉所有错误类型语句             # 有错误就执行这条语句
else:语句         # 没有错误就执行该语句
finally:语句         # 无论如何都要执行的语句,例如关闭文件
'''try:f = open("D:/pythonlearing.txt", "r")
except Exception as e:print("代码有问题,执行except下语句")print(1)
else:print("没有错误")
finally:print("记得关闭文件")f.close()# 输出结果
'''
没有错误
记得关闭文件
'''
3.Python自带模块
  • 模块的定义:模块其实就是一个python文件,以.py结尾,模块里面能定义函数、类、变量等,我们可以拿过来用(导入模块去使用),模块相当于工具包
  • 模块的导入方式:[from 模块名] import [模块|类|变量|函数|*] [as 别名] ,[ ]表示可选,星号表示导入全部
  • import 模块名:基本格式如下:
'''
import 模块名
import 模块名1, 模块名2模块名.功能名()
'''# 导入时间模块
import time     # 按住ctrl然后点击可以查看模块具体内容
print("你好")
time.sleep(5)   # 通过.可以使用模块内的指定功能
print("你也好")# 输出结果
'''
你好
你也好
'''
  • from 模块名 import 功能名:基本格式如下。
'''
from 模块名 import 功能名功能名()
'''# 导入时间模块
from time import sleep    # 按住ctrl然后鼠标点击可以查看模块具体内容
print("你好")
sleep(5)   # 通过.可以使用模块内的指定功能
print("你也好")# 输出结果
'''
你好
你也好
'''
  • **from 模块名 import 星号 **:基本格式如下:
'''
from 模块名 import *    # 导入模块中的全部功能功能名()
'''# 导入时间模块
from time import *    # 按住ctrl然后鼠标点击可以查看模块具体内容
print("你好")
sleep(5)              # 直接使用模块内的指定功能,不用.
print("你也好")# 输出结果
'''
你好
你也好
'''
  • as定义别名
  1. import 模块名 as 别名
'''
import 模块名 as 别名别名.功能()'''# 导入时间模块
import time as t
print("你好")
t.sleep(5)
print("你也好")# 输出结果
'''
你好
你也好
'''
  1. from 模块名 import 功能名 as 别名
'''
from 模块名 import 功能名 as 别名别名()'''# 导入时间模块
from time import sleep as s
print("你好")
s(5)
print("你也好")# 输出结果
'''
你好
你也好
'''

4.Python自定义模块

首先,新建一个my_module.py文件作为自己的模块,在该模块里面定义一个求两数平方和函数my_add,以及求两数和平均函数my_average。

my_module.py如下:

def my_add(x, y):result = x ** 2 + y ** 2return resultdef my_average(x, y):result = (x + y) / 2return result

在其它python文件中调用my_module.py的两个函数:

from my_module import my_add, my_averagea = my_add(1, 2)
b = my_average(2, 3)print(a)
print(b)# 输出结果
'''
5
2.5
'''

不同模块要避免同名功能,举例如下:

from my_module1 import my_add   # 无效
from my_module2 import my_add   # 有效

  • ——name——变量(其实是下划线)

对于——name变——量,我是这么理解的:python文件在运行的时候,该文件的内置变量——name——会赋值为"——main——",这个时候,如果想在模块下面测试写的一些功能,又不想在被其它python文件调用的时候被执行,就可以写在模块最后写:

if __name__ == '__main__':

然后在if语句下面做一些该模块功能的测试,这样的话,在其它代码调用该模块功能的时候,这些测试代码就不会被执行


  • —all—变量(其实是下划线)

如果一个模块文件中有"—all—“变量,那么当使用"from xxx import 星号"的时候,就只能导入”—all—"变量对应的列表中的功能,举例如下:

__all__ = ["my_add"]def my_add(x, y):result = x ** 2 + y ** 2return resultdef my_average(x, y):result = (x + y) / 2return result

这个时候,如果其他代码文件使用了,from my_module import *的话,就只有my_add这个功能能被调用,其它功能不能调用。但可以手动导入,比如:from my_module import my_average,这个时候这个功能依然能被正常使用


5.Python包
  • 定义:包就是一个文件夹,里面可以存放许多python模块(代码文件),通过包(中的—init—.py文件),在逻辑上可以将一批模块归为一类,便于调用

  • 构建包:以一个简单例子说明流程。1.创建python软件包:bao(此时包下会自动生成—init—.py文件);2.在bao文件夹下写入自己的一些模块:例如my_module1.py,my_module2.py;3.在—init—.py文件里面用——all——变量,写入:

__all__ = ["my_module1", "my_module2"]

补充一下my_module1.py和my_module2.py的内容:

my_module2.py

def f_add(x, y):return x + y

my_module1.py

def f_sub(x, y):return x - y

这个时候,在另一个文件可以按照如下方式去调用这些模块和功能

from bao import *
a = my_module1.f_add(1, 2)
b = my_module2.f_sub(1, 2)
print(a)
print(b)# 输出结果'''
3
-1
'''
  • 包的作用:可以实现更好的分类管理,比如可以把处理医学数据的模块放在一个包下
  • 第三方包:pip安装

6.综合案例
  • 题目

在包内提供 2 个模块:

str_util.py

(字符串相关工具,内含:)

函数:str_reverse(s),接受传入字符串,将字符串反转返回

函数:substr(s, x, y),按照下标 xy,对字符串进行切片

file_util.py

(文件处理相关工具,内含:)

函数:print_file_info(file_name),接收传入文件的路径,打印文件的全部内容,如文件不存在则捕获异常,输出提示信息,通过 finally 关闭文件对象

函数:append_to_file(file_name, data),接收文件路径以及传入数据,将数据追加写入到文件中

  • 参考

str_util.py

def str_reverse(s):print(s[::-1])def substr(s, x, y):print(s[x:y])# 下面是测试代码
if __name__ == '__main__':str_reverse("[1, 2, 3, 4]")substr("12345", 1, 2)

file_util.py

def print_file_info(file_name):f = Nonetry:f = open(file_name, "r", encoding="UTF-8")print(f.read())except FileNotFoundError:print("文件不存在")finally:if f:f.close()def append_to_file(file_name, data):f = open(file_name, "a", encoding="UTF-8")f.write(data)f.close()# 下面是测试代码
if __name__ == '__main__':print_file_info("D:/y.txt")append_to_file("D:/pythonlearing.txt", "12e14")
http://www.dtcms.com/a/389823.html

相关文章:

  • 第三方网站系统测试:【基于Pytest的自动化测试框架的测试】
  • 每个 SIwave 求解器的正确激励
  • 给 C++ Protobuf“装上 Abseil”版本确认、Bazel/CMake 实战与避坑
  • Java 大视界 -- Java 大数据在智能物流运输车辆智能调度与路径优化中的技术实现
  • 电脑中的32位和64位
  • 如何免费使用AWS服务器?AWS Free Tier免费套餐申请与避坑指南
  • QML界面调用C++层阻塞函数,如何不卡界面
  • JVM GC 调优:GC 问题发现工具,五大 GC 异常模式,四大调优方案与案例实战
  • Excel处理控件Aspose.Cells教程:如何使用Python在Excel中创建下拉列表
  • React 18.2中使用Redux 5.0.1
  • 程序开发的基本规律
  • Day26_【深度学习(6)_神经网络NN(1.1)激活函数_softmax详解篇】
  • 通过调用deepseek大模型接口对千条评论信息进行文本分析/词频分析/情感分析
  • 攻坚家电代工转型痛点|远望电器牵手盘古信息,以IMS重塑数字制造根基
  • SpringBoot实现Markdown语法转HTML标签
  • DeepSeek:大语言模型在中文生态中的技术突破与应用探索
  • 【Agent博客分享】从多Agent问题到新的上下文工程方法
  • 点云分割中 offset 与 batch 表示的转换详解
  • C++23 堆栈跟踪功能实战:从内存泄漏梦魇到一键定位的调试革命
  • jvm参数调优(持续更新)
  • 容器查看日志工具-stern
  • 衍射光学元件DOE:台阶高度与位置误差的测量
  • Java中对象/嵌套对象属性复制工具类使用示例:Hutools工具类BeanUtils使用示例
  • rust编写web服务02-路由与请求处理
  • Spring Cloud - 微服务限流的方式
  • 【智能系统项目开发与学习记录】ROS2基础(1)
  • 人工智能面试题:什么是CRF条件随机场
  • [x-cmd] 命令式交互、CLI/TUI 设计与 LLM
  • 基于AMBA总线协议的Verilog语言模型实现
  • 【Agent项目复现】OpenManus复现