【Python】Python异常、模块与包
Python异常、模块与包
文章目录
- Python异常、模块与包
- @[toc]
- 1.异常的概念
- 2.异常的捕获
- 3.Python自带模块
- 4.Python自定义模块
- 5.Python包
- 6.综合案例
文章目录
- Python异常、模块与包
- @[toc]
- 1.异常的概念
- 2.异常的捕获
- 3.Python自带模块
- 4.Python自定义模块
- 5.Python包
- 6.综合案例
1.异常的概念
- 定义:就是BUG,即程序错误,BUG这一词源于一只飞蛾引发的计算机故障
2.异常的捕获
当程序遇到BUG的时候,有两种情况:直接停止运行;对BUG进行提醒,整个程序继续运行
- 异常捕获的作用:提前假设某处会出现异常,做好提前准备,当真出现异常的时候,可以有后续手段,基本格式如下:
'''
try:可能发生错误的代码
except:如果出现异常执行的代码
'''# 举例:以只读模式打开一个不存在的文件,可以知道会报错;如果出现报错,那么执行写入模式
try:f = open("D:/learing.txt", "r", encoding="UTF-8")
except:print("代码有问题,执行except下语句")f = open("D:/pythonlearing.txt", "w", encoding="UTF-8")# 输出结果
'''
代码有问题,执行except下语句
'''
可以捕获所有异常。
- **捕获单个指定异常:**基本格式如下:
'''
try:可能发生错误的代码
except 具体错误类型 as e: # 只捕捉上面的的错误类型,对于其它错误不捕捉语句 # 有错误就执行这条语句
'''try:print(name)
except NameError as e:print("是代码有问题,执行except下语句")print(1)try:print(name)
except NameError as e:print("是代码有问题,执行except下语句")print(e)try:a = 1 / 0
except NameError as e:print("是代码有问题,执行except下语句")print(1)# 输出结果
'''
Traceback (most recent call last):File "C:\Users\Administrator\Desktop\pythonProject\main.py", line 22, in <module>a = 1 / 0~~^~~
ZeroDivisionError: division by zero
是代码有问题,执行except下语句
1
是代码有问题,执行except下语句
name 'name' is not defined
'''
- 捕获多个指定异常:基本格式如下:
'''
try:可能发生错误的代码
except (错误类型1, 错误类型2) as e: # 只捕捉上面两个错误类型,对于其它错误不捕捉语句 # 有错误就执行这条语句
'''try:a = 1 / 0
except (NameError, ZeroDivisionError) as e:print("是代码有问题,执行except下语句")print(1)print(e)# 输出结果
'''
是代码有问题,执行except下语句
1
division by zero
'''
- 捕获所有异常:基本格式如下:
'''
try:可能发生错误的代码
except Exception as e: # 捕捉所有错误类型语句 # 有错误就执行这条语句
'''try:f = open("D:/3.txt", "r")a = 3 / 0
except Exception as e:print("代码有问题,执行except下语句")print(1)# 输出结果
'''
代码有问题,执行except下语句
1
'''
- 异常的else语句:基本格式如下:
'''
try:可能发生错误的代码
except Exception as e:语句 # 捕捉所有错误类型
else:语句 # 没有错误就执行该语句
'''try:a = 0 / 3
except Exception as e:print("代码有问题,执行except下语句")print(1)
else:print("没有错误")# 输出结果
'''
没有错误
'''
- 异常的finally语句:基本格式如下:
'''
try:可能发生错误的代码
except Exception as e: # 捕捉所有错误类型语句 # 有错误就执行这条语句
else:语句 # 没有错误就执行该语句
finally:语句 # 无论如何都要执行的语句,例如关闭文件
'''try:f = open("D:/pythonlearing.txt", "r")
except Exception as e:print("代码有问题,执行except下语句")print(1)
else:print("没有错误")
finally:print("记得关闭文件")f.close()# 输出结果
'''
没有错误
记得关闭文件
'''
3.Python自带模块
- 模块的定义:模块其实就是一个python文件,以.py结尾,模块里面能定义函数、类、变量等,我们可以拿过来用(导入模块去使用),模块相当于工具包
- 模块的导入方式:[from 模块名] import [模块|类|变量|函数|*] [as 别名] ,[ ]表示可选,星号表示导入全部
- import 模块名:基本格式如下:
'''
import 模块名
import 模块名1, 模块名2模块名.功能名()
'''# 导入时间模块
import time # 按住ctrl然后点击可以查看模块具体内容
print("你好")
time.sleep(5) # 通过.可以使用模块内的指定功能
print("你也好")# 输出结果
'''
你好
你也好
'''
- from 模块名 import 功能名:基本格式如下。
'''
from 模块名 import 功能名功能名()
'''# 导入时间模块
from time import sleep # 按住ctrl然后鼠标点击可以查看模块具体内容
print("你好")
sleep(5) # 通过.可以使用模块内的指定功能
print("你也好")# 输出结果
'''
你好
你也好
'''
- **from 模块名 import 星号 **:基本格式如下:
'''
from 模块名 import * # 导入模块中的全部功能功能名()
'''# 导入时间模块
from time import * # 按住ctrl然后鼠标点击可以查看模块具体内容
print("你好")
sleep(5) # 直接使用模块内的指定功能,不用.
print("你也好")# 输出结果
'''
你好
你也好
'''
- as定义别名
- import 模块名 as 别名
'''
import 模块名 as 别名别名.功能()'''# 导入时间模块
import time as t
print("你好")
t.sleep(5)
print("你也好")# 输出结果
'''
你好
你也好
'''
- from 模块名 import 功能名 as 别名
'''
from 模块名 import 功能名 as 别名别名()'''# 导入时间模块
from time import sleep as s
print("你好")
s(5)
print("你也好")# 输出结果
'''
你好
你也好
'''
4.Python自定义模块
首先,新建一个my_module.py文件作为自己的模块,在该模块里面定义一个求两数平方和函数my_add,以及求两数和平均函数my_average。
my_module.py如下:
def my_add(x, y):result = x ** 2 + y ** 2return resultdef my_average(x, y):result = (x + y) / 2return result
在其它python文件中调用my_module.py的两个函数:
from my_module import my_add, my_averagea = my_add(1, 2)
b = my_average(2, 3)print(a)
print(b)# 输出结果
'''
5
2.5
'''
不同模块要避免同名功能,举例如下:
from my_module1 import my_add # 无效
from my_module2 import my_add # 有效
- ——name——变量(其实是下划线)
对于——name变——量,我是这么理解的:python文件在运行的时候,该文件的内置变量——name——会赋值为"——main——",这个时候,如果想在模块下面测试写的一些功能,又不想在被其它python文件调用的时候被执行,就可以写在模块最后写:
if __name__ == '__main__':
然后在if语句下面做一些该模块功能的测试,这样的话,在其它代码调用该模块功能的时候,这些测试代码就不会被执行
- —all—变量(其实是下划线)
如果一个模块文件中有"—all—“变量,那么当使用"from xxx import 星号"的时候,就只能导入”—all—"变量对应的列表中的功能,举例如下:
__all__ = ["my_add"]def my_add(x, y):result = x ** 2 + y ** 2return resultdef my_average(x, y):result = (x + y) / 2return result
这个时候,如果其他代码文件使用了,from my_module import *的话,就只有my_add这个功能能被调用,其它功能不能调用。但可以手动导入,比如:from my_module import my_average,这个时候这个功能依然能被正常使用
5.Python包
-
定义:包就是一个文件夹,里面可以存放许多python模块(代码文件),通过包(中的—init—.py文件),在逻辑上可以将一批模块归为一类,便于调用
-
构建包:以一个简单例子说明流程。1.创建python软件包:bao(此时包下会自动生成—init—.py文件);2.在bao文件夹下写入自己的一些模块:例如my_module1.py,my_module2.py;3.在—init—.py文件里面用——all——变量,写入:
__all__ = ["my_module1", "my_module2"]
补充一下my_module1.py和my_module2.py的内容:
my_module2.py
def f_add(x, y):return x + y
my_module1.py
def f_sub(x, y):return x - y
这个时候,在另一个文件可以按照如下方式去调用这些模块和功能
from bao import *
a = my_module1.f_add(1, 2)
b = my_module2.f_sub(1, 2)
print(a)
print(b)# 输出结果'''
3
-1
'''
- 包的作用:可以实现更好的分类管理,比如可以把处理医学数据的模块放在一个包下
- 第三方包:pip安装
6.综合案例
- 题目
在包内提供 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.py
def str_reverse(s):print(s[::-1])def substr(s, x, y):print(s[x:y])# 下面是测试代码
if __name__ == '__main__':str_reverse("[1, 2, 3, 4]")substr("12345", 1, 2)
file_util.py
def print_file_info(file_name):f = Nonetry:f = open(file_name, "r", encoding="UTF-8")print(f.read())except FileNotFoundError:print("文件不存在")finally:if f:f.close()def append_to_file(file_name, data):f = open(file_name, "a", encoding="UTF-8")f.write(data)f.close()# 下面是测试代码
if __name__ == '__main__':print_file_info("D:/y.txt")append_to_file("D:/pythonlearing.txt", "12e14")