一、异常
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/0
print(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 / 0
print("C() 结束执行") # 这行代码不会被执行
def B():
print("B() 开始执行")
C()
print("B() 结束执行") # 如果异常没有在C中被处理,这行代码也不会被执行
def A():
print("A() 开始执行")
try:
B()
except ZeroDivisionError:
print("捕获到了一个除以零的异常")
print("A() 结束执行")
A()
解释:
- 当函数 C 中的代码 1 / 0 执行时,产生了一个
ZeroDivisionError
异常。 - 由于函数 C 内没有对异常进行处理,该异常被抛出到调用它的函数 B。
- 函数 B 也没有处理这个异常,因此异常继续向上传递到函数 A。
- 在函数 A 中,有一个
try...except
结构包围了对函数 B 的调用。这里的except ZeroDivisionError
成功捕获了从 C 通过 B 传递来的异常。 - 一旦异常被捕获,程序继续执行 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 time
print("开始")
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 + y
def 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 + y
def sub(x, y):
return x - y
if __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 + y
def sub(x, y):
return x - y
def 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