【Python】异常、模块与包

news2025/1/13 15:34:24

目录

捕获异常

异常的传递

Python中的模块

模块的导入方式

as定义别名

自定义模块

Python包

第三方包

综合案例


当我们的程序遇到了BUG, 那么接下来有两种情况:

① 整个程序因为一个BUG停止运行

② 对BUG进行提醒, 整个程序继续运行

但是在真实工作中, 我们肯定不能因为一个小的BUG就让整个程序全部奔溃, 也就是我们希望的是达到② 的这种情况

那这里我们就需要使用到捕获异常。捕获异常的作用在于提前假设某处会出现异常,做好提前准备,当真的出现异常的时候,可以有后续手段。

捕获异常

捕获异常的基本语法为

try:

可能发生错误的代码

except:

如果出现异常执行的代码

举个例子,下面的代码表示尝试以“r”模式打开文件,如果文件不存在,则使用“w”的模式打开文件。

这里的except我们没有指定捕获什么类型的异常,因此就会捕获所有类型的异常。捕获所有异常的写法除了except后面啥也不写,还可以写成except Exception as e:,这个e使我们随便起的名字,他是一个异常对象,通过打印他可以知道e里面的内容就是异常的信息,比如变量未定义,比如除零等等。我们也可以在指定捕获某种类型的异常比如除零异常,名字异常等。这样except就只会接收固定类型的异常了。

举个例子

我没有定义name这个变量,但是却想要打印他,显然会报错,这是一种NameError,至于这个e他是一个异常对象,我们可以打印他看看。

如果要捕获多个异常且不是全部异常,其实和上面捕获一个异常写法差不多,只不过捕获一个异常使用的是一个异常类型,而捕获多个异常就要写多个异常类型,并使用一个元组进行封装。比如:

这个代码将针对名字错误和除零错误进行报错。其余异常不理会。

实际上对于异常捕获的语法来讲还有两个可选的语句就是else和finally,其中else中的代码是如果没有异常要执行的,而finally中的代码是不管有没有异常都要执行的,通常是文件的关闭等。直接看下面的代码:

这就是一个捕获异常的完整语法了,其中try表示我先尝试执行

f=open("a.txt","r",encoding="UTF-8")

这句代码,如果有异常就去执行

f=open("a.txt","w",encoding="UTF-8")

当然如果没有异常将会执行以下else里面这句话,而不管有没有异常都会执行finally里面这句话。

异常的传递

有这样一段代码

其中func1中有除零异常,然后func2调用了func1,func3调用了func2,然后我们调用func3函数,结果如图

发现第三行有个除零的错误层层传递到了13行也就是我们调用func3函数的那一行。因此如果有异常,我们其实不需要精准定位到出错的那一行,因为异常是具有传递性的。

再来看这个代码

运行结果如图

发现func1中的除零异常在我们调用func3的时候仍然可以被找到,这就是异常的传递性。

Python中的模块

在学习C语言的时候我们知道如果想要调用库函数,需要先引上其所在的头文件,实际上Python中的模块扮演的就是像C语言中头文件一样的作用,它实际上就是一个.py的代码文件,里面有里面有类、函数、变量等,我们可以拿过来用(导入模块去使用)

模块的导入方式

其中[]表示可以省略,也就是说模块导入的语法中只要有一个import就行了。'|'表示或的意思,也就是说我们可以导入模块本身,也可以导入模块内部的类,变量,函数,*表示导入模块内的全部内容,导入之后可以使用点操作符来使用到模块内部的变量,类,函数等等。

常用的组合形式如:

import 模块名

from 模块名 import 类、变量、方法等

from 模块名 import *

import 模块名 as 别名

from 模块名 import 功能名 as 别名

来看代码

首先我们使用import关键字导入了Python内置的模块time,导入之后我们就可以使用点操作符来访问time这个模块(其实就是一个Python文件,里面有函数,变量,类等)的全部内容了,比如使用这个模块的函数sleep。

调用某块中的某个功能除了像上面一样导入模块之后使用点操作符,还有另一种写法,语法为from 模块名 import 功能名,但是使用这样的方式就不能使用导入模块的其他功能了,比如from time import sleep,就只能使用time模块中的sleep函数了。且使用这种方法在下面调用sleep函数的时候就不用写time.sleep了,直接写sleep即可。那如果我们写from time import *,就表示导入time模块的所有功能,跟直接写import time的方式效果一样,只是在调用的时候使用from time import *调用模块的功能变量等等的时候不用使用点操作符,而直接import time的话如果要调用某个功能还需要借助点操作符。

as定义别名

在导入模块的过程中有时候某些模块或者模块中某些功能的名字很长,每次调用就很不方便,我们就可以使用关键字as把这种名字定义成一个别的简单的名字,比如import time as t:

这样就把time这个模块的名字用t代替掉了,在下面调用time模块里面的功能的时候就可以写成t.sleep等

比如from time import sleep as s:

这句代码表示把time中名为sleep的功能名字改成s,这样我们在下面调用sleep函数的时候就可以写成s(5)等,表示暂停五秒。

自定义模块

前面说了模块就是一个Python文件,里面实际上就是一些Python代码,所以我们当然可以把自己写的Python文件作为模块导入到当前代码中。

如果导入的两个模块中都出现了名为test的函数,那么我们调用的是哪一个呢?

举个例子,my_model1和my_model2中都有一个名为test的函数,代码如下

my_model1

my_model2

运行代码

运行结果如下

可以发现如果使用点操作符,由于指定了test函数来自于哪个模块,所以能够正确的得出结果,但是如果使用from 模块 import 功能的语法,就只运行了下面的那个test,上面的test被覆盖掉了。

为了避免这样的情况我们可以使用重命名的方式来将两个名字相同的功能区分开。比如下面的代码

运行结果为

如果在导入的模块中有函数的调用,比如这个模块,

里面调用了test函数,那么我们把这个模块导入到当前代码中之后,即使不调用里面的test函数,也会出现test函数的结果。但是在模块中调用函数用于测试模块代码还是经常要用到的一个操作,有没有一种写法可以在模块中测试模块中的函数,但是在导入到当前代码的时候还不会执行用于测试的函数呢?

答案是有的,只在当前文件中调用该函数,其他导入的文件内不符合该条件,则不执行test函数调用if __name__ == '__main__': 如图所示

在实际操作的时候我们只需要打一个main然后在出现的列表中找这个语句就可以了。

前面我们提到过在导入模块的时候如果写成import* 就表示模块中所有的内容都可以使用,原理是写了import* 之后其实是从一个名为__all__的变量中提取功能,这个变量存放的是一个列表,列表中是一系列功能的名字,且允许我们自己指定列表中的内容。如果模块中没有写__all__变量,那么import*之后所有功能都能用,如果一个模块文件中有__all__变量,当使用from xxx import *导入时,只能导入这个列表中的元素,不在列表中的功能就无法使用了。但是__all__变量只是影响了import*这样的写法,如果我们直接写from 模块名 import 功能,还是可以使用不在__all__列表的功能的。

Python包

从物理上看,包就是一个文件夹,在该文件夹下包含了一个 init.py 文件,该文件夹可用于包含多个模块文件

从逻辑上看,包的本质依然是模块

说人话就是文件夹里面有 init.py 文件那么这个文件夹就是一个Python包,否则就是一个普通文件夹。

init.py这个文件里面可以不写内容,也可以写,一般情况下如果是写内容的话就是写__all__变量,用于指定其列表中的内容,影响的是import*这种写法能够使用哪个模块。

导入Python包的方式与导入模块的方式类似,导入的层级不同调用功能的写法就不一样,如图

运行结果如图

第三方包

在Python程序的生态中,有许多非常多的第三方包(非Python官方),可以极大的帮助我们提高开发效率,如:

科学计算中常用的:numpy包

数据分析中常用的:pandas包

大数据计算中常用的:pyspark、apache-flink包

图形可视化常用的:matplotlib、pyecharts

人工智能常用的:tensorflow

第三方包的安装非常简单,我们只需要使用Python内置的pip程序即可。打开命令提示符程序,在里面输入:

pip install 包名称 即可通过网络快速安装第三方包,如图

综合案例

创建一个自定义包,名称为:my_utils (我的工具)

在包内提供2个模块

str_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

file.util

test9

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1623518.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Spring Security系列】Spring Security整合JWT:构建安全的Web应用

前言 在企业级开发或者我们自己的课程设计中,确保用户数据的安全性和访问控制非常重要。而Spring Security和JWT是都两个强大的工具,它俩结合可以帮助我们实现这一目标。 Spring Security提供了全面的安全功能,而JWT则是一种用于身份验证的…

(C++) this_thread 函数介绍

文章目录 &#x1f6a9;前言⭐std::this_thread&#x1f579;️get_id()&#x1f5a5;️Code&#x1f516;get_id介绍&#x1f3f7;️其他介绍 &#x1f579;️sleep_for<>()&#x1f5a5;️Code&#x1f516;sleep_for介绍&#x1f3f7;️其他介绍 &#x1f579;️sleep…

第三节课,后端登录【1】

一、总任务 二、登录接口 get 请求&#xff0c;有缺陷&#xff0c;长度有限制 三、登录逻辑 四、代码书写位置 4.1 编写业务逻辑的位置 五、写代码 5.1 代码1 5.1.1 细节 按 CtrlAltShiftL ,快速格式化 5.1. 2 自动生成接口参数 先/** 再回车 效果图 5.2 按 alt enter …

数据结构练习-算法与时间复杂度

----------------------------------------------------------------------------------------------------------------------------- 1. 设n是描述问题规模的非负整数&#xff0c;下列程序段的时间复杂度是( )。 x0;while(n>(x1)*(x1)xx1; A.O(logn) B.O(n^(1/2)) C.O(n)…

ubuntu无法用快捷键启动终端(CTRL+AIT+T)

我的电脑不知道安装什么东西之后&#xff0c;就不能用快捷键&#xff08;CTRLAITT&#xff09;打开终端了 只能在文件夹内&#xff0c;点击鼠标右键选择终端&#xff0c;然后打开终端 一直这么用了几个月&#xff0c;今天实在受不了了&#xff0c;所以解决此问题 本文参考文章…

Seata 的AT模式写隔离问题,求大佬解答。

引用Seata 是什么&#xff1f; | Apache Seata AT 模式 前提​ 基于支持本地 ACID 事务的关系型数据库。Java 应用&#xff0c;通过 JDBC 访问数据库。 整体机制​ 两阶段提交协议的演变&#xff1a; 一阶段&#xff1a;业务数据和回滚日志记录在同一个本地事务中提交&…

岭回归(概念+实例)

目录 前言 一、基本概念 1. 引言 2. 岭回归的原理 3. 数学表达式 4. 岭回归的优点 5. 岭回归的局限性 6. 实际应用 二、具体实例 前言 “岭回归”这个词源于英文“Ridge Regression”&#xff0c;是一种用于处理回归分析中多重共线性&#xff08;multicollinearity&am…

java-spring-mybatis -学习第一天-基础知识讲解

目录 前置条件(创建一个项目) Mybatis 定义 可能出现的问题 这边如果连接不上数据库 ​编辑 Dao接口设计 Mybatis流程 创建实体类 User 和其属性 创建Mapper的接口类 测试类测试 实例数据库数据的更新 实例数据库数值的删除 最重要的是有一个原始的数据库 -我这边…

传统行业还在使用FTP传输?试试这套FTP替代传输解决方案!

在数字化转型的浪潮中&#xff0c;传统企业对文件传输的需求日益增长。然而&#xff0c;许多企业仍在使用传统的文件传输协议&#xff08;FTP&#xff09;来处理文件传输任务。尽管FTP在早期被广泛采用&#xff0c;但其固有的弊端逐渐成为企业发展的桎梏&#xff0c;所以找一个…

SQL中的锁

一、概述 介绍 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资(CPU、RAM、I/0)的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题&#xff0c;锁冲…

大模型 AI 框架昇思 MindSpore 2.3.RC1 发布,训练、推理性能大幅提升,JIT 编译强化

经过社区开发者们几个月的开发与贡献&#xff0c;现正式发布昇思 MindSpore2.3.RC1 版本&#xff0c;通过多维混合并行以及确定性 CKPT 来实现超大集群的高性能训练&#xff0c;支持大模型训推一体架构&#xff0c;大模型开发训练推理更简、更稳、更高效&#xff0c;并在训推一…

【CMU15-445 Part-19】Multi-Version Concurrency Control

Part19-Multi-Version Concurrency Control 其实说到底 MVCC不仅是一种并发控制协议&#xff0c;更是一个系统构建&#xff08;数据组织的方法&#xff09;。 简介 writer 不会 block readers&#xff0c;reader 也不会 block writers。只读事务可以读到一个consistent的sna…

nlp 自然语言处理的dataset数据库积累

下面的这个和 entity recognition有关的。 Weights & Biases

光伏无人机巡检主要有些什么功能和特点?

随着科技的飞速发展&#xff0c;无人机技术已经渗透到多个行业领域&#xff0c;光伏产业便是其中之一。光伏无人机巡检&#xff0c;作为一种新兴的巡检方式&#xff0c;正在逐渐取代传统的人工巡检&#xff0c;为光伏电站的安全、高效运行提供了有力保障。那么&#xff0c;光伏…

10:00面试,10:08就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

“我也想和月牙一样,把不满写在脸上”

贪吃蛇的初级实现 1. Win32 API介绍1.1 Win32 API1.2 控制台程序1.3 控制台屏幕上的坐标COORD1.4 GetStdHandle1.5 GetConsoleCursorInfo1.5.1 CONSOLE_CURSOR_INFO 1.6 SetConsoleCursorInfo1.7 SetConsoleCursorPosition1.8 GetAsyncKeyState 2. 贪吃蛇游戏设计与分析2.1 地图…

使用Shell终端访问Linux

一、实验目的 1、熟悉Linux文件系统访问命令&#xff1b; 2、熟悉常用 Linux Shell的命令&#xff1b; 3、熟悉在Linux文件系统中vi编辑器的使用&#xff1b; 4、进一步熟悉虚拟机网络连接模式与参数配置&#xff01; 二、实验内容 1、使用root帐号登陆到Linux的X-windows…

2024年了,还有必要搭建企业网站吗?

现在企业的营销手段五花八门。当下火爆的短视频直播平台展现出的裂变效应也取得不错的成绩&#xff0c;这不禁让很多企业舍弃做网站的念头&#xff0c;投入自媒体账号。那么&#xff0c;2024年了&#xff0c;还有必要搭建企业网站吗&#xff1f; 我们分两种企业来看&#xff1…

【11-Ⅱ】Head First Java 学习笔记

HeadFirst Java 本人有C语言基础&#xff0c;通过阅读Java廖雪峰网站&#xff0c;简单速成了java&#xff0c;但对其中一些入门概念有所疏漏&#xff0c;阅读本书以弥补。 第一章 Java入门 第二章 面向对象 第三章 变量 第四章 方法操作实例变量 第五章 程序实战 第六章 Java…

3d软件哪个适合新手学?3D动画渲染怎么好

在不同的行业领域&#xff0c;3D建模和动画的需求各异&#xff0c;因此所需的3D软件工具也会有所不同。对于刚开始接触3D设计的新手来说&#xff0c;软件的易操作性、丰富的学习资源以及与自己专业领域相关的功能是选择时的重要考虑因素。以下是几款适合初学者入门的3D软件推荐…