【Python】异常、模块与包

目录

捕获异常

异常的传递

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.rhkb.cn/news/313586.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第十五届蓝桥杯省赛第二场C/C++B组D题【前缀总分】题解(AC)

暴力解法 O ( 26 n 5 ) O(26n^5) O(26n5) 枚举将第 i i i 个字符串的第 j j j 个字符改为 c c c 的所有方案,时间复杂度 O ( 26 n 2 ) O(26n^2) O(26n2),修改并计算总分, O ( n 3 ) O(n^3) O(n3)。 暴力优化 O ( 26 n 3 log ⁡ n ) O…

【Pytorch】(十四)C++ 加载TorchScript 模型

文章目录 (十四)C 加载TorchScript 模型Step 1: 将PyTorch模型转换为TorchScriptStep 2: 将TorchScript序列化为文件Step 3: C程序中加载TorchScript模型Step 4: C程序中运行TorchScript模型 【Pytorch】(十三)PyTorch模型部署: T…

什么是langchain

概念 LangChain 是一个用于开发由语言模型驱动的应用程序的框架。他主要拥有 2 个能力: -可以将 LLM 模型(大规模语言模型)与外部数据源进行连接 -允许与 LLM 模型进行交互基础功能 支持多种模型接口,比如 OpenAI、Hugging Fac…

Delta模拟器:iOS上的复古游戏天堂

Delta模拟器:iOS上的复古游戏天堂 在数字时代,我们有时会怀念起那些早期的电子游戏,它们简单、纯粹,带给我们无尽的乐趣。虽然现在的游戏在画质和玩法上都有了巨大的提升,但那种复古的感觉却始终无法替代。幸运的是&a…

Ceph 分布式文件系统 搭建及使用

一、Ceph 介绍 在当今数据爆炸式增长的时代,企业对于可靠、可扩展的存储解决方案的需求日益迫切。Ceph 作为一种开源的、可伸缩的分布式存储解决方案,正逐渐成为企业级存储领域的热门选择。Ceph是一种由Radicalbit公司开发的开源分布式存储系统&#xf…

公网IP地址如何申请SSL证书?有免费的IP ssl吗?

如果用户没有域名或只有公网IP地址或者不方便使用域名,IP地址ssl证书这一特殊的证书可以为IP地址实现HTTPS的安全保护,提高网站数据传输的安全性。 IP地址申请SSL证书的基本步骤 IP ssl证书下载---注册填写230916https://www.joyssl.com/certificate/sel…

MySQL——运维

日志 错误日志 错误日志是 MySQL 中最重要的日志之一,它记录了当 mysqld 启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,建议首先查看此日志。 查看日志位置: sho…

信息系统项目管理师0070:数据开发利用(5信息系统工程—5.2数据工程—5.2.4数据开发利用)

点击查看专栏目录 文章目录 5.2.4数据开发利用1.数据集成2.数据挖掘3.数据服务4.数据可视化5.信息检索5.2.4数据开发利用 数据只有得到充分的开发利用才能发挥出它的作用。通过数据集成、数据挖掘和数据服务(目录服务、查询服务、浏览和下载服务、数据分发服务)、数据可视化、信…

# 从浅入深 学习 SpringCloud 微服务架构(六)Feign(3)

从浅入深 学习 SpringCloud 微服务架构(六)Feign(3) 一、组件的使用方式总结 1、注册中心 1) Eureka 搭建注册中心 引入依赖 spring-cloud-starter-netflix-eureka-server。 配置 EurekaServer。 通过 EnableEure…

安全AI未来 | C3安全大会 · 2024,数据驱动 AI原生

数字为时代变革注入动力,AI为重塑社会文明带来原力。数智浪潮中,我们见证着时代跃迁的巨变,面临着适变、应变、驭变的挑战。 数字驱动、AI原生。数字的流动不仅承载着信息,更将激活未来的无限价值;AI,不…

基于OpenCV的人脸签到系统

效果图 目录文件 camerathread.h 功能实现全写在.h里了 class CameraThread : public QThread {Q_OBJECT public:CameraThread(){//打开序号为0的摄像头m_cap.open(0);if (!m_cap.isOpened()) {qDebug() << "Error: Cannot open camera";}//判断是否有文件,人脸…

restful请求风格的增删改查-----查询and添加

一、restful风格的介绍 restful也称之为REST ( Representational State Transfer )&#xff0c;可以将它理解为一种软件架构风格或设计风格&#xff0c;而不是一个标准。简单来说&#xff0c;restful风格就是把请求参数变成请求路径的一种风格。例如&#xff0c;传统的URL请求…

PHP项目搭建与启动

1、拉取项目 2、安装phpstudy 下载地址&#xff1a; Windows版phpstudy下载 - 小皮面板(phpstudy) (xp.cn) 软件安装&#xff1a; Apache2.4.39、Nginx1.15.11、MySQL8.0.12、 composer2.5.8 添加伪静态 将下面代码写入到伪静态配置文本域框内&#xff1a; location ~* (ru…

多线程(安全 同步 线程池)

线程安全问题 多线程给我们的程序带来了很大性能上的提升&#xff0c;但是也可能引发线程安全问题线程安全问题指的是当多个线程同时操作同一个共享资源的时候&#xff0c;可能会出现的操作结果不符预期问题 取钱的线程安全问题 线程安全问题出现的原因&#xff1f; 存在多线…

创新科技赋能旅游服务:智慧文旅引领旅游发展新篇章,智能体验助力产业转型升级

随着科技的飞速发展和人们生活水平的提高&#xff0c;旅游业正迎来前所未有的发展机遇。创新科技在旅游服务领域的广泛应用&#xff0c;不仅提升了旅游体验的品质&#xff0c;也为旅游产业的转型升级注入了新的动力。智慧文旅作为旅游业与信息技术深度融合的产物&#xff0c;正…

matlab新手快速上手5(蚁群算法)

本文根据一个较为简单的蚁群算法框架详细分析蚁群算法的实现过程&#xff0c;对matlab新手友好&#xff0c;源码在文末给出。 蚁群算法简介&#xff1a; 蚁群算法是一种启发式优化算法&#xff0c;灵感来源于观察蚂蚁寻找食物的行为。在这个算法中&#xff0c;解决方案被看作是…

如何利用交易形态的失败进行现货黄金?

进行现货黄金理财&#xff0c;除了需要投资者对黄金投资有热情之外&#xff0c;有方法也是很重要的&#xff0c;光有热情而没有技术&#xff0c;我们的资金很可能会成为其他人的囊中之物。但如果有了现货黄金理财的技术&#xff0c;情况就可能扭转过来。下面我们就从买入的角度…

vue2实现字节流byte[]数组的图片预览

项目使用vantui框架&#xff0c;后端返回图片的字节流byte[]数组&#xff0c;在移动端实现预览&#xff0c;实现代码如下&#xff1a; <template><!-- 附件预览 --><div class"file-preview-wrap"><van-overlay :show"show"><…

【draw.io的使用心得介绍】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

14.MMD导入Blender及贴图步骤

MMD导出.abc文件 在MMD十周年桥版本导入一个人物模型&#xff0c;这里导入仆人 注意MMD的路径不能有中文 点击上面的MMDBridge 设定 第一个选择blender by 第二个选择实行 这里是选择帧数范围和帧率 帧率一定要是30&#xff0c;不然后面可能会出问题 点击文件导出视频…