一、异常
在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中,raise
和try
是异常处理机制的两个核心要素。它们协同工作,用于检测和处理在程序执行过程中可能发生的错误情况。
2、raise
语句被用来触发一个异常。当程序执行到某个无法继续或需要特别处理的点时,可以使用 raise
抛出一个异常。这个异常可以是Python内置的(如 ValueError
, TypeError
等),也可以是用户自定义的(通过继承 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、创建自定义模块:
-
编写模块代码:
首先,你需要编写一个Python文件,这个文件将作为你的自定义模块。确保文件名和模块名符合Python的命名规范(通常是小写字母和下划线的组合,避免使用空格和特殊字符)。例如,你可以创建一个名为
mymodule.py
的文件,并在其中编写一些函数或类。 -
保存模块文件:
将你的模块文件保存在一个目录中。这个目录可以是你的项目目录,也可以是Python的模块搜索路径之一(如当前工作目录、PYTHONPATH
环境变量指定的目录等)。
2、导入自定义模块
-
确保模块路径正确:
在导入自定义模块之前,你需要确保Python解释器能够找到它。这通常意味着你的模块文件应该位于当前工作目录、PYTHONPATH
环境变量指定的目录之一,或者你已经将其包含在一个Python包中。 -
导入模块:
在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
模块中导入了所有定义的函数(foo
和bar
)和变量(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 别名