Python小白学习教程从入门到入坑------第十八课 异常模块与包【上】(语法基础)

一、异常 

在Python中,异常(Exception)是一种用于处理在程序运行时可能发生的错误情况的机制

异常允许程序在检测到错误时不是简单地崩溃,而是能够优雅地处理这些错误,可能包括记录错误信息、清理资源、或者向用户提供有用的反馈

1.1 异常的基本概念

异常类型:Python内置了许多异常类型,如ValueError、TypeError、ZeroDivisionError等,用于表示不同类型的错误情况。此外,你也可以通过继承Exception类或其子类来创建自定义的异常类型

引发异常:使用raise语句可以手动引发一个异常。这可以在检测到某个错误条件时发生,或者仅仅是为了测试异常处理代码

捕获异常:使用try...except结构可以捕获并处理异常。try块包含可能会引发异常的代码,而except块则包含当异常发生时应该执行的代码

传递异常:如果在函数或方法中发生了异常,并且没有在该作用域内被捕获,那么异常会被传递给调用者。这个过程会一直持续到异常被捕获,或者程序因为未处理的异常而终止

异常链:在Python 3中,你可以使用raise ... from ...语法来明确指定一个异常是由另一个异常引发的,从而保留原始的异常信息和追溯信息

1.2 raise引发的异常

在 Python 中,raise 语句用于引发一个指定的异常。当程序执行到 raise 语句时,它会立即终止当前代码块的执行,并将控制权交给异常处理代码(如果有的话)

步骤:

1. 创建一个Exception(‘xxx’)对象,xxx---异常提示信息

2. raise 抛出这个对象(异常对象)

eg:执行了raise语法,代码不会继续往下运行

# raise Exception(”君君抛出了一个异常“)
def funa():raise Exception("君君抛出了一个异常")print("哈哈哈,笑死了")  # 执行了raise语法,代码不会继续往下运行
funa()

1.3 异常的捕获和处理 

eg1:

需求:密码长度不足,就报异常

分析:用户输入密码,判断输入的长度是否大于等于6,如果输入长度不足6位数,就报错,即抛出自定义异常,并捕获该异常

def login():pwd = input("请输入您的密码:")if len(pwd) >= 6:     # len() 求长度return "密码输入成功"raise Exception("长度不足6位,密码输入失败")
# print(login())
try:print(login())
except Exception as e:print(e)
# 捕获异常是为了检测到异常代码时代码还能继续往下运行,即程序不会终止
# 输出结果:
# 请输入您的密码:389
# 长度不足6位,密码输入失败

 eg2:

try:  # 可能会引发异常的代码  x = 1 / 0  # 这将引发ZeroDivisionError  
except ZeroDivisionError:  # 处理ZeroDivisionError异常的代码  print("Cannot divide by zero!")  
except Exception as e:  # 捕获所有其他异常类型  # 处理其他异常的代码  print(f"An unexpected error occurred: {e}")  
else:  # 如果没有异常发生,执行这里的代码  print("Division successful!")  
finally:  # 无论是否发生异常,都会执行这里的代码  print("This block is always executed.")

在此例子中,try块中的代码尝试执行一个除法操作,该操作会引发ZeroDivisionError。由于该异常在except ZeroDivisionError块中被捕获,因此程序会打印一条错误消息而不是崩溃。else块是可选的,当没有异常发生时,其中的代码会被执行。finally块也是可选的,但非常有用,因为它会无条件执行,常用于清理工作

1.4 注意

1、在Python中,raisetry是异常处理机制的两个核心要素。它们协同工作,用于检测和处理在程序执行过程中可能发生的错误情况。

2、raise 语句被用来触发一个异常。当程序执行到某个无法继续或需要特别处理的点时,可以使用 raise 抛出一个异常。这个异常可以是Python内置的(如 ValueErrorTypeError 等),也可以是用户自定义的(通过继承 Exception 类或其子类来创建)

3、try 语句用于包裹可能会引发异常的代码块。与之配套的还有 except 子句,用于捕获并处理这些异常。 

二、模块

含义:一个py文件就是一个模块,即导入一个模块本质上就是执行一个 py文件

2.1 模块分类

2.1.1 内置模块

如:math、random、time、os、logging,直接导入即可使用 

eg:导入math模块:提供了许多数学运算函数

import math  # 计算平方根  
print(math.sqrt(16))  # 输出: 4.0  # 获取圆周率π的值  
print(math.pi)  # 输出: 3.141592653589793
2.1.2 第三方模块(第三方库)

在Python中,安装和导入第三方模块通常涉及以下几个步骤:

1、安装第三方模块

使用pip安装:

下载:cmd窗口输入:pip install+模块名

win+r 输入cmd


Python的包管理工具pip是安装第三方模块的最常用方式。pip通常与Python一起安装,但如果你没有它,需要先安装它。

打开命令行或终端,然后输入以下命令来安装一个模块(例如,requests模块):

pip install requests

2、导入第三方模块

一旦模块安装成功,你就可以在Python脚本或交互式环境中导入并使用它

import requests  # 现在你可以使用requests模块中的功能了  
response = requests.get('https://api.github.com')  
print(response.status_code)
 2.1.3 自定义模块

含义:即自己在项目中定义的模块

注意:命名要遵循标识符规定以及变量的命名规范,并且不要与内置模块起冲突,否则将导致模块功能无法使用

在Python中,安装和导入自定义模块通常涉及以下几个步骤:

1、创建自定义模块:

  1. 编写模块代码:
    首先,你需要编写一个Python文件,这个文件将作为你的自定义模块。确保文件名和模块名符合Python的命名规范(通常是小写字母和下划线的组合,避免使用空格和特殊字符)。

    例如,你可以创建一个名为mymodule.py的文件,并在其中编写一些函数或类。

  2. 保存模块文件:
    将你的模块文件保存在一个目录中。这个目录可以是你的项目目录,也可以是Python的模块搜索路径之一(如当前工作目录、PYTHONPATH环境变量指定的目录等)。

2、导入自定义模块

  1. 确保模块路径正确:
    在导入自定义模块之前,你需要确保Python解释器能够找到它。这通常意味着你的模块文件应该位于当前工作目录、PYTHONPATH环境变量指定的目录之一,或者你已经将其包含在一个Python包中。

  2. 导入模块:
    在Python脚本或交互式环境中,使用import语句来导入你的自定义模块

import mymodule  # 现在你可以使用mymodule中定义的函数或类了  
result = mymodule.some_function()  
print(result)

如果模块和脚本位于同一目录中,上述代码通常可以正常工作。如果它们位于不同的目录中,你可能需要调整工作目录或使用相对/绝对导入

2.2 导入模块

在Python中,导入模块是一种组织和重用代码的方式。模块可以是Python标准库中的模块、第三方库中的模块,或者是你自己编写的模块

2.2.1 导入方式一

导入模块:

import 模块名 (注意:可以一个import导入多个模块,但最好是一个模块单独使用一个import)

调用功能:

模块名 功能名

eg:自己新建了一个模块pytest,现在要调用pytest中的name变量

# import 模块名
# 调用功能:
# 模块名.功能名
import pytest
# 调用pytest模块中的name变量
print(pytest.name)
2.2.2 导入方式二

语法:from...import...(从模块中导入指定的部分)

from  模块名  import  功能1,功能2...

在Python中,from 模块名 import 功能1, 功能2 是一种导入模块中特定功能(函数、类、变量等)的语法。这种导入方式允许你直接访问模块中的特定功能,而不需要通过模块名作为前缀

eg:假设你有一个名为math_utils.py的模块,它包含以下两个函数:

# math_utils.py  def add(a, b):  return a + b  def subtract(a, b):  return a - b

现在,你想在另一个Python脚本或交互式环境中使用这两个函数。你可以使用以下导入语句: 

from math_utils import add, subtract  # 导入函数只需要函数名,不需要加上()# 现在你可以直接使用add和subtract函数,而不需要通过math_utils.前缀  
result1 = add(5, 3)  
result2 = subtract(5, 3)  print(result1)  # 输出: 8  
print(result2)  # 输出: 2
2.2.3 导入方式三

语法:from  模块名  import  *(把模块中的所有内容全部导入)

注意:  不建议过多使用from...import..,声明,有时候命名冲突会造成一些错误

eg:假设你有一个名为example_module.py的模块,内容如下:

# example_module.py  def foo():  print("Hello from foo!")  def bar():  print("Hello from bar!")  baz = "I am baz"

现在,你在另一个Python脚本或交互式环境中使用from example_module import *语句:

# another_script.py  from example_module import *  # 现在你可以直接使用foo, bar和baz,而不需要通过example_module.前缀  
foo()  # 输出: Hello from foo!  
bar()  # 输出: Hello from bar!  
print(baz)  # 输出: I am baz

在这个例子中,another_script.py脚本从example_module.py模块中导入了所有定义的函数(foobar)和变量(baz

因此,你可以直接在这些函数和变量上调用,而不需要通过模块名作为前缀

2.2.4 as起别名

1. as给模块起别名

语法:import  模块名  as  别名

eg: 

新建了一个模块pytest:

print("这是pytest模块")
# 变量
name = 'junjun'
# 函数
def funa():print("这是pytest模块中的funa()")
def funb():print("这是pytest模块中的funb()")

给模块起别名并调用模块中的函数及变量

import pytest as pt
# 调用模块中的funa变量
pt.funa()  # 输出结果:这是pytest模块中的funa()
# 打印模块中的name变量
print(pt.name)   # 输出结果:junjun

2、as给功能起别名
语法:from  模块名  import  功能  as  别名

eg:

新建了一个模块pytest:

print("这是pytest模块")
# 变量
name = 'junjun'
# 函数
def funa():print("这是pytest模块中的funa()")
def funb():print("这是pytest模块中的funb()")

给模块中的功能起别名并调用

from pytest import funa as a,name, funb as b
a()
print(name)
b()
# 注意:导入多个功能,使用逗号将功能与功能隔开,后面的功能也可以取别名:功能名 as 别名

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

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

相关文章

A4-C四驱高防变电站巡检机器人

在电力行业数字化、智能化转型进程中,搭载多模态成像传感器的变电站巡检机器人、视频监控设备逐渐取代传统人工,成为变电设备状态监测的主要工具。变电站巡检机器人具有全天候、非接触式、多参量测量等特点,结合内置人工智能算法完成仪表识别…

MATLAB锂电概率分布模型

🎯要点 概率分布等效电路模型结合了路径相关速率能力及状态估计中滞后效应。纠正了充电状态中时间误差累积及避免开路电压中电压滞后现象。使用电流方向和电池容量相关函数描述开路电压,并使用微分方程描述电压滞后现象。模型结构基于一级相变的材料机制…

QT界面开发--我的第一个windows窗体【菜单栏、工具栏、状态栏、铆接部件、文本编辑器、按钮、主界面】

经过前面的铺垫,今天我们就开始我们图形化界面之旅了,我们的第一个窗体主要包括:菜单栏、状态栏、工具栏、铆接部件、还有Qt提供的一些主窗体的API。 第一部分:主界面(QMainWindow) 当创建好项目后,我们直接运行&…

Unity中的动画状态机(详解)

动画状态机的定义 Unity中的动画状态机(Animator Controller)是用于定义和管理角色或对象动画状态之间转换的工具。它允许动画师和开发者设计复杂的动画逻辑; 例如角色的行走、跑步、跳跃、攻击等动作,以及其他动作之间的平滑过渡…

Vue笔记-element ui中关于table的前端分页

对于 Element UI 表格的前端分页&#xff0c;可以在组件中使用 JavaScript 来实现数据的分页显示&#xff0c;而不必从后端获取已分页的数据。以下是一个简单的示例&#xff0c;演示如何在前端进行 Element UI 表格的分页&#xff1a; <template><div><el-tabl…

ShellCode 格式化代码注入工具

一款基于C/C开发的应用层汇编代码注入工具&#xff0c;可实现向特定进程内注入动态链接库模块或注入ShellCode汇编指令集&#xff0c;还可以实现第三方进程的汇编级Call调用&#xff0c;通常被用于协助渗透人员完成内存注入&#xff0c;同时也可用于对特定ShellCode汇编代码进行…

Ubuntu系统安装软件

在Linux系统中有四种软件安装方式&#xff1a;rpm、yum、apt、编译安装 编译安装 编译安装只有一个源码包&#xff0c;源码包是由一大堆源代码程序组成的&#xff0c;是由程序员按照特定格式和语法编写好了&#xff0c;现成的安装包 程序&#xff1a;未执行的代码 进程&#…

雷池社区版compose配置文件解析-mgt

在现代网络安全中&#xff0c;选择合适的 Web 应用防火墙至关重要。雷池&#xff08;SafeLine&#xff09;社区版免费切好用。为网站提供全面的保护&#xff0c;帮助网站抵御各种网络攻击。 compose.yml 文件是 Docker Compose 的核心文件&#xff0c;用于定义和管理多个 Dock…

自动驾驶-传感器简述

自动驾驶车辆上的传感器类型包含激光雷达、毫米波雷达、相机、imu、rtk、超声波雷达等&#xff0c;这些传感器用来接收外部世界多姿多彩的信号&#xff0c;根据接收到的信号&#xff0c;车载大脑对信号进行处理&#xff0c;那信号的准确程度就尤为重要。 本文将各个传感器的特性…

Lucas带你手撕机器学习——岭回归

岭回归&#xff08;Ridge Regression&#xff09; 一、背景与引入 在进行线性回归分析时&#xff0c;我们常常面临多重共线性的问题。多重共线性指的是自变量之间高度相关&#xff0c;这会导致回归系数的不稳定性&#xff0c;使得模型的预测能力降低。传统的线性回归通过最小…

模块化主动隔振系统市场规模:2023年全球市场规模大约为220.54百万美元

模块化主动隔振系统是一种用于精密设备和实验装置的隔振解决方案&#xff0c;通过主动控制技术消除振动干扰&#xff0c;提供稳定的环境。目前&#xff0c;随着微纳制造和精密测量技术的发展&#xff0c;对隔振系统的要求越来越高。模块化设计使得系统能够灵活适应不同负载和工…

STM32 第3章 如何用串口下载程序

时间:2024.10.28 一、学习内容 1、安装USB转串口驱动 1.1串口下载连接示意图 1、USB转串口模块在开发板上是一个独立的模块,可通过调帽与其他串口连接,USART1/2/3/4/5 2、只有USART1才具有串口下载的功能。 3、CH340是电平转换芯片,将电脑端输出的USB电平和单片机输…

1.3 面向对象 C++面试问题

1.3.1 简述一下什么是面向对象,面向对象与面向过程的区别 什么是面向对象 面向对象&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;是一种编程范式&#xff0c;它通过将现实世界中的实体抽象为“对象”来组织代码。面向对象编程关注对象及其交互&#x…

行业首发|美格智能创新推出5G+Wi-Fi 7智能终端解决方案,端侧AI助力数智升维

在数字化时代的生产生活过程中&#xff0c;特殊场景下的通信需求愈发重要。高速、灵活、稳定的通信保障能够进一步提升生产生活的效率。随着5G网络的高速发展&#xff0c;一方面&#xff0c;其凭借低时延、高带宽、高可靠性和大规模连接的特性让移动终端的网络连接实现跨越式升…

论文解析八: GAN:Generative Adversarial Nets(生成对抗网络)

目录 1.GAN&#xff1a;Generative Adversarial Nets&#xff08;生成对抗网络&#xff09;1、标题 作者2、摘要 Abstract3、导言 IntroductionGAN的介绍 4、相关工作 Related work5、模型 Adversarial nets总结 6.理论计算 Theoretical Results具体算法公式全局优化 Global O…

【32】C++流

目录 C流 读写文件&#xff1a;文件流 对文本文件流读写 写文本文件 读文本文件 对二进制文件流读写 写二进制文件 读二进制文件 对文件流按格式读写取数据 按指定格式写文件 按指定格式读文件 C流 IO: 向设备输入数据和输出数据 C的IO流 设备: 文件控制台特定的数…

21世纪20年代了, 居然遭遇扩容U盘!

扩容u盘前些年很泛滥&#xff0c; 所以也有针对扩容u盘的测试软件 h2testw h2testw的工作原理很简单&#xff0c; 就是往u盘里写文件&#xff0c;写满后再读取文件进行验证 如果没有h2test&#xff0c; 也可以往里面考大文件&#xff0c; 再拷贝出来&#xff0c; 不出错就表示…

Navicat导入Excel数据时数据被截断问题分析与解决方案

目录 前言1. 问题分析1.1 默认字段类型的影响1.2 MySQL诊断机制的限制 2. 解决方案2.1 修改字段长度2.2 修改Excel数据以影响推断2.3 检查导入工具的设置 3. 其他注意事项3.1 注册表的修改3.2 增加自增ID 4. 结语 前言 在数据库的日常操作中&#xff0c;将Excel数据导入MySQL是…

SQL Server 当前日期及其未来三天的日期

当前日期及其未来三天的日期&#xff0c;并分别以 YYYY-MM-DD 和 yyyyMMdd 的格式展示 1、当前日期及其未来三天的日期&#xff0c;以 YYYY-MM-DD的格式展示 WITH CurrentDate AS (SELECT GETDATE() AS 当前日期 ) -- 使用 CONVERT 函数 SELECTCONVERT(VARCHAR(10), 当前日期,…

Ubuntu22.04版本左右,扩充用户可使用内存

1 取得root权限后&#xff0c;输入命令 lsblk 查看所有磁盘和分区&#xff0c;找到想要替换用户可使用文件夹内存的磁盘和分区。若没有进行分区&#xff0c;并转为所需要的分区数据类型&#xff0c;先进行分区与格式化&#xff0c;过程自行查阅。 扩充替换过程&#xff0c;例如…