python学习笔记----异常、模块与包(九)

一、异常

1.1 什么是异常

  • 在Python中,异常是程序执行时发生的错误。当Python检测到一个错误时,它会引发一个异常,这可能是由于多种原因,如尝试除以零、访问不存在的文件,或者尝试从列表中获取不存在的索引等。
  • 异常处理是一种编程方法,用于预见并处理这些潜在的错误情况。它可以帮助程序在遇到错误时优雅地恢复,而不是完全中断执行。

1.2 异常的捕获(异常处理)

1.2.1 为什么要捕获异常

  • 世界上没有完美的程序,任何程序在运行的过程中,都可能出现异常,导致程序无法继续运行下去。
  • 我们要做的,不是力求程序完美运行,而是在力所能及的范围内,对可能出现的bug,进行提前准备、提前处理。
  • 这种行为我们称之为:异常处理(捕获异常)

1.2.1 捕获异常

语法:

try:可能发生错误的代码
except:如果出现异常要执行的代码
# 基本捕获
try:f = open("C:\\Users\\ABC\\Desktop\\example1.txt", "r", encoding="utf-8")
except:print("出现异常了,文件不存在,我将open的模式,改为w模式去打开")f = open("C:\\Users\\ABC\\Desktop\\example1.txt", "w", encoding="utf-8")# 捕获指定的异常
try:print(name)
except NameError as e:print("出新了变量未定义的异常")# 捕获多个异常
try:# 1/0print(name)
except (NameError, ZeroDivisionError) as e:print("出现了变量未定义或者除0的异常错误")# 捕获所有异常
try:f = open("C:\\Users\\ABC\\Desktop\\example1.txt", "r", encoding="utf-8")
except Exception as e:print()

1.2.2 异常else

  • else表示的是如果没有异常要执行的代码
try:print(1)
except Exception as e:print(e)
else:print("我是else, 是没有异常的时候执行的代码")

1.2.3 异常的finally

  • finally表示的是无论是否异常都要执行的代码,例如关闭文件对象。
try:f = open("C:\\Users\\ABC\\Desktop\\example1.txt", "r", encoding="utf-8")
except:print("出现异常了,文件不存在,我将open的模式,改为w模式去打开")f = open("C:\\Users\\ABC\\Desktop\\example1.txt", "w", encoding="utf-8")
else:print("好高兴,没有异常")
finally:print("我是finally,有没有异常我都要执行")f.close()


1.3异常的传递

  • 异常传递是一个在程序中异常从发生点向上层代码传播的过程,直到被处理或导致程序终止。在 Python 中,如果一个函数中发生了异常而没有在该函数内部被捕获和处理,那么这个异常会被抛向该函数被调用的地方。如果在那里也没有被处理,异常继续向上传播,这个过程会持续进行,直到遇到一个处理该异常的 except 块,或者到达了程序的最顶层,导致程序终止。

示例:

def C():print("C() 开始执行")# 这里发生了一个除以零的异常x = 1 / 0print("C() 结束执行")  # 这行代码不会被执行def B():print("B() 开始执行")C()print("B() 结束执行")  # 如果异常没有在C中被处理,这行代码也不会被执行def A():print("A() 开始执行")try:B()except ZeroDivisionError:print("捕获到了一个除以零的异常")print("A() 结束执行")A()

解释:

  1. 当函数 C 中的代码 1 / 0 执行时,产生了一个 ZeroDivisionError 异常。
  2. 由于函数 C 内没有对异常进行处理,该异常被抛出到调用它的函数 B。
  3. 函数 B 也没有处理这个异常,因此异常继续向上传递到函数 A。
  4. 在函数 A 中,有一个 try...except 结构包围了对函数 B 的调用。这里的 except ZeroDivisionError 成功捕获了从 C 通过 B 传递来的异常。
  5. 一旦异常被捕获,程序继续执行 A 中 except 块后的代码。



二、python模块

2.1 什么是模块

  • 在 Python 中,模块是一个包含 Python 定义和声明的文件。模块的主要目的是帮助组织代码,并支持代码的重用性。每个 Python 文件(以 .py 结尾)都可以被视为一个模块,模块的名字与文件名相同。
  • 大白话:模块就是一个python文件,里面有类、函数、变量等,我们可以拿过来用(导入模块去使用)

2.2 模块的导入方式

语法:[from 模块名] improt [模块 | 类 | 变量 | 函数 | *] [as 别名]
常用的组合形式如:

- import 模块名
- from 模块名 import 类、变量、方法等
- from模块名 import *
- improt 模块名 as 别名
- from 模块名 import 功能名 as 别名

示例:

# 使用import导入time模块(time.py)
import timeprint("开始")
time.sleep(5)
print("结束")
# 只导入time的sleep函数
from time import sleep
print("开始")
sleep(5)
print("结束")
# 导入time模块中所有的方法
from time import *
print("开始")
sleep(5)
print("结束")
# 给导入的time模块取别名
import time as t
print("开始")
t.sleep(5)
print("结束")
# 给导入的time模块中的sleep函数取别名
from time import sleep as sl
print("开始")
sl(5)
print("结束")


2.3 自定义模块

步骤 1: 创建模块

  • 我们可以创建一个名为 my_math.py 的文件,用于定义一些基本的数学运算函数。

my_math.py

# 定义一个加法函数
def add(x, y):return x + y# 定义一个减法函数
def subtract(x, y):return x - y# 定义一个乘法函数
def multiply(x, y):return x * y

步骤 2: 使用模块

  • 创建一个main.py 来使用my_math.py模块

main.py

import my_math# 使用 mymath 模块中的函数
result1 = my_math.add(10, 5)
print("10 + 5 =", result1)result2 = my_math.subtract(10, 5)
print("10 - 5 =", result2)result3 = my_math.multiply(10, 5)
print("10 * 5 =", result3)

步骤3:运行结果

10 + 5 = 15
10 - 5 = 5
10 * 5 = 50


2.4 测试模块

  • 在实际开发中,当一个开发人员编写完一个模块后,为了让模块能够在项目中达到想要的效果,这个开发人员可能会在模块中添加一些测试信息,例如下面的my_math.py模块

my_math.py

def add(x, y):return x + ydef sub(x, y):return x - y# 测试代码
print(add(1, 2))
print(sub(10, 5))
  • 此时在主文件main.py中调用my_math.py模块会出现测试代码也被执行的情况

main.py

import my_math# 使用 mymath 模块中的函数
result1 = my_math.add(10, 5)
print("10 + 5 =", result1)result2 = my_math.sub(10, 5)
print("10 - 5 =", result2)

运行结果:

3
5
10 + 5 = 15
10 - 5 = 5

解决方法

  • 在 Python 中,if __name__ == '__main__': 这一行经常用在脚本的最末尾。这行代码的目的是确定该 Python 文件是被直接运行的还是被导入到其他文件中作为模块使用。
  • __name__ 是 Python 中的一个内置变量。当 Python 脚本直接运行时,__name__ 被赋予值 '__main__'。如果该文件是被其他文件导入的,则 __name__ 被赋予其模块名(即文件名)。


我们可以在if __name__ == '__main__':的下方写测试代码解决这个问题

my_math.py

def add(x, y):return x + ydef sub(x, y):return x - yif __name__ == '__main__':print(add(1, 2))print(sub(10, 5))



2.5 __all__

  • 如果一个模块文件中有__all__变量,当使用from xxx import *导入该模块时,只能导入这个列表中的元素

例子:

my_math.py

__all__ = ['add', 'sub']def add(x, y):return x + ydef sub(x, y):return x - ydef mul(x, y):return x * y
  • 此时mul函数未导入,将无法使用
from my_math import *result1 = add(10, 5)
print("10 + 5 =", result1)result2 = sub(10, 5)
print("10 - 5 =", result2)# 报错
result3 = mul(5, 5)
print("5 * 5 =", result3)



二、python包

2.1 什么是python包

  • 从物理上看,包就是一个文件夹,在该文件夹下包含了一个__init__.py文件,该文件夹可以用于包含多个模块文件。
  • 从逻辑上看,包的本质依然是模块。
    在这里插入图片描述
  • 当我们的模块文件越来越多时,包可帮助我们管理这些模块,包的作用就是包含多个模块,但包的本质依然是模块

2.2 如何创建包

在这里插入图片描述
注意:新建包后,包的内部会自动创建__init__.py文件,这个文件控制着包的导入行为。



2.3 导入包

import 包名.模块名
# 使用
包名.模块名.方法
from 包名.模块名 import 方法


2.4 安装第三方包

2.4.1 什么是第三方包

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

  • 科学计算中常用的:numpy
  • 数据分析中常用的:pandas
  • 大数据计算中常用的:pyspark、apache-flink
  • 图形可视化常用的:matplotlib、pyecharts
  • 人工智能常用的:tensorflow

由于是第三方的包,python没有内置,所以我们需要安装他们才可以导入使用

2.4.2 安装第三方包-pip

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

在Centos7上部署LDAP服务

安装ldap和设置自起 - 安装ldap yum install -y openldap-servers openldap-clients openldap openldap-devel compat-openldap openldap-servers-sql- 启动和开机自起 systemctl start slapd systemctl enable slapd- 查看服务是否安装成功 配置ldap - 创建第一个管理账号…

基于MSOGI的交叉对消谐波信号提取网络MATLAB仿真

微❤关注“电气仔推送”获得资料(专享优惠) 模型简介: 此模型利用二阶广义积分器(SOGI)对基波电流和相应次的谐波电流进行取 ,具体是通过多个基于二阶广义积分器的正交信号发生器 ( S&#xf…

JAVA面试之MQ

如何保证消息的可靠传输?如果消息丢了怎么办 数据的丢失问题,可能出现在生产者、MQ、消费者中。 (1)生产者发送消息时丢失: ①生产者发送消息时连接MQ失败 ②生产者发送消息到达MQ后未找到Exchange(交换机) ③生产者发…

按照数组原来的规律将新插入的数组插入(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int i 0;int j 0;int temp1 0;int temp2 0;int end 0;int number 0;int a[11] { 1, …

LeetCode 131 —— 分割回文串

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 首先&#xff0c;按照 LeetCode 5——最长回文子串 中的思路&#xff0c;我们先求出 d p dp dp&#xff0c;这样我们就知道了所有的子串是否是回文子串。 然后&#xff0c;我们进行一个 dfs 搜索&#xff0c;起…

Ubuntu系统安装nvfortran详细步骤【笔记】

实践设备&#xff1a;华硕FX-PRO&#xff08;NVIDIA GeForce GTX 960M&#xff09; Ubuntu系统安装NVFORTRAN&#xff08;NVIDIA Fortran Compiler&#xff09;步骤如下&#xff1a; 安装依赖项&#xff1a;在安装NVFORTRAN之前&#xff0c;你需要确保系统已经安装了一些必要…

使用docker安装redis

使用docker安装redis ①拉取镜像 docker pull redis:6.2.6② 创建容器 docker run -d --name forum-redis --restartalways -p 6379:6379 redis:6.2.6 redis-server --requirepass "dong97"③链接测试 打开Redis Desktop Manager&#xff0c;输入host、port、pas…

无法定位程序输入点QTextStream

当您的应用在调试模式下运行正常&#xff0c;但在发布&#xff08;发布构建&#xff09;后出现错误时&#xff0c;可能涉及到以下几个常见的原因&#xff1a; 动态链接库问题&#xff1a;发布构建可能没有包含必要的动态链接库&#xff08;DLL&#xff09;&#xff0c;或者没有…

《与 Apollo 共创生态——Apollo7周年大会干货分享》

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” 文章目录 阿波罗X企业自动驾驶解决方案自动驾驶技术提升与挑战自动驾驶系统功能与性能的详细解析<td alig…

Linux进程——进程的创建(fork的原理)

前言&#xff1a;在上一篇文章中&#xff0c;我们已经会使用getpid/getppid函数来查看pid和ppid,本篇文章会介绍第二种查看进程的方法&#xff0c;以及如何创建子进程&#xff01; 本篇主要内容&#xff1a; 查看进程的第二种方法创建子进程系统调用函数fork 在开始前&#xff…

6.python网络编程

文章目录 1.生产者消费者-生成器版2.生产者消费者--异步版本3.客户端/服务端-多线程版4.IO多路复用TCPServer模型4.1Select4.2Epoll 5.异步IO多路复用TCPServer模型 1.生产者消费者-生成器版 import time# 消费者 def consumer():cnt yieldwhile True:if cnt < 0:# 暂停、…

上班族小张的副业之路:下班后的水牛社赚钱故事

在快节奏的都市生活中&#xff0c;上班族小张每天忙碌于办公室与家庭之间&#xff0c;重复着朝九晚五的生活。然而&#xff0c;他内心总渴望寻找一种既能充实生活&#xff0c;又能增加收入的副业方式。直到有一天&#xff0c;他发现了水牛社——一个为他提供丰富副业资源和机会…

python学习笔记B-17:序列结构之字典--字典的相关操作

字典的常用操作方法和函数如下&#xff1a; d {1:["东方延续","太空军自然选择号舰长","女","33"],2:["章北海","太空军自然选择号政委","男","39"],3:["罗辑","太空军自然…

AI大模型探索之路-训练篇10:大语言模型Transformer库-Tokenizer组件实践

系列篇章&#x1f4a5; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据集概…

compose调用系统分享功能分享图片文件

compose调用系统分享功能图片文件 简介UI界面提供给外部程序的文件访问权限创建FileProvider设置共享文件夹 通用分享工具虚拟机验证结果参考 本系列用于新人安卓基础入门学习笔记&#xff0c;有任何不同的见解欢迎留言 运行环境 jdk17 andriod 34 compose material3 简介 本案…

nginx的前世今生(二)

书接上回&#xff1a; 上回书说到&#xff0c;nginx的前世今生&#xff0c;这回我们继续说 3.缓冲秘籍&#xff0c;洪流控水 Nginx的缓冲区是其处理数据传输和提高性能的关键设计之一&#xff0c;主要用于暂存和管理进出的数据流&#xff0c;以应对不同组件间速度不匹配的问题…

【JVM】class文件格式,JVM加载class文件流程,JVM运行时内存区域,对象分配内存流程

这篇文章本来只是想讲一下class文件格式&#xff0c;讲着讲着越讲越多。JVM这一块吧&#xff0c;知识比较散比较多&#xff0c;如果深研究下去如死扣《深入理解Java虚拟机》&#xff0c;这本书很深很细&#xff0c;全记住是不可能的&#xff0c;其实也没必要。趁这个机会直接把…

[Java EE] 多线程(六):线程池与定时器

1. 线程池 1.1 什么是线程池 我们前面提到,线程的创建要比进程开销小,但是如果线程的创建/销毁比较频繁,开销也会比较大.所以我们便引入了线程池,线程池的作用就是提前把线程都创建好,放到用户态代码中写的数据结构中,后面就可以随用随取. 线程池最大的好处就是减少每次启动,…

【Canvas】给图片绘制矩形以及添加文字

效果图: <!DOCTYPE html> <html lang"en"><head><title>Canvas Marker Example</title></head><body><!-- 图片 --><imgid"myImage"src图片地址alt"Image to mark"style"display: no…

java-函数式编程-函数对象

定义 什么是合格的函数&#xff1f;无论多少次执行函数&#xff0c;只要输入一样&#xff0c;输出就不会改变 对象方法的简写 其实在类中&#xff0c;我们很多参数中都有一个this&#xff0c;被隐藏传入了 函数也可以作为对象传递&#xff0c;lambda就是很好的例子 函数式接口中…