python进阶,在第一期的基础上做了极大的优化,整体更加美观易懂
十四、模块和包、异常
14.1、模块了解,及基础
python模块(Module),是一个python文件,以.py结尾,包含了python对象定义和python语句。模块能定义函数,类和变量,模块里也能包含可执行的代码
导入模块的方式
. 1、导入math模块
. 2、调用模块内的sqrt()功能函数
1、 import 模块名
语法:
> import 模块名
> import 模块名1, 模块名2......
> 模块名.功能名()
import math # 导入math函数
print(math.sqrt(16)) # 返回16的平方跟
# 结果:4.0
2、from 模块名 import 功能名
> 语法:from 模块名 import 功能1, 功能2, 功能3
from math import sqrt # 从math模块中导入sqrt函数
print(sqrt(81))
# 结果:9.0
3、 from 模块名 import *
语法:
> from 模块名 import *
from math import * # *号表示模块中所有函数全部导入
print(sqrt(49))
# 结果:7.0
4、 as定义别名
语法:
> import 模块名 as 别名
> from 模块名 import 功能名 as 别名
小需求:运行后暂停2秒打印hello world!!!
a、 模块起别名
# 1、导入time中的sleep函数(休眠)
import time as q # 使用as别名后,无法再使用time模块,因为给time模块起别名为q
q.sleep(2)
print("hello world!!!")
# 结果:
hello world!!!
b、功能函数起别名
from time import sleep as sd # 同样使用sd别名后,无法再使用sleep函数,使用会报错
sd(2) # 会先暂停2秒再打印
print("hello world!!")
# 结果:
hello world!!
14.2、制作模块
定义模块:在python中,每个python文件都可以作为一个模块,模块的名字就是文件的名字。也就是说自定义模块名必须要符合标识符命名规则(4条)。
小需求:
# a、新建一个python文件,命名为my_modulel.py, 并定义testA函数,testA函数完成2个数字的加法运算
def testA(a, b):
print(a + b)
# b、测试模块
# 测试模块(一般测试模块不注释,方便后期维护)
# c、调用模块
testA(5, 9.99) #测试模块testA函数没问题
# 结果:14.99 # 结果正确
# 系统变量:__name__,如果是在当前文件下使用的话,那么它打印的结果是__main__,否则是当前模块(my_modulel1)的名字
print(__name__) # 结果:__name__
if __name__ == "__name__": # 判断是否在当前文件模块下去执行if语句中的代码
# 测试模块
testA(1, 4) # 测试模块中的testA函数有没有问题
# 结果: __main__
新建.py文件,调用模块
# 1、导入模块
# 2、使用模块
import my_modulel_1
my_modulel_1.testA(4, 5)
结果:9
14.3、模块定位顺序
搜索顺序:
1、当前目录
2、如果不在当前目录,python则搜索在PYTHONPATH下的每个目录。
3、如果都找不到,python会查看默认路径
注意:
a、自己的文件名不要和已有的模块名重复,否则导致模块功能无法使用
b、使用from 模块名 import 功能的时候,注意功能名字重复,调用到的是最后定义或导入的功能
# time模块中导入sleep()
def sleep():
print("这是一个导入的功能")
from time import sleep
sleep(2) # 暂停2秒再运行下面的程序,下面没有不运行
14.4、__all__列表
__all__右边接列表:作用,可以控制当前模块的导入行为
需求:
如果一个模块文件中有_all_变量,当使用from xx import *导入时,只能导入这个列表中的元素
# 模块代码:(新建.py文件, 在新的py文件里面做)
__all__ = ["testA"] # 表示testA可以被其他.py文件导入,而testB不行如果要导入testB,则要在列表中加上testB
def testA():
print("testA")
def testB():
print("testB")
14.5、包的使用
了解包:包将有联系的模块组织在一起,即放到同一个文件夹下,并且在这个文件夹创建一个名字为_init_.py文件,那么这个文件夹就被称之为包
制作包:
1、[New]-[Python Package]-输入包名-[ok]-新建功能模块(有联系的模块)。
2、注意:新建包后,包内部会自动创建_init_.py文件,这个文件控制着包的导入行为。
14.6、导入包
方法一
> import 包名.模块名
> 包名.模块名.目标名
例如:
# 例如:导入mypackage包下的模块,使用模块内的info__print1函数
import mypackage.module1 # mypackage->包名, module1->模块名
mypackage.module1.info_print1() # # mypackage->包名, module1->模块名, info_print1()->函数名
方法二
> 注意:必须在_init_.py文件中添加_all_=[],控制允许导入的模块列表,[中填允许导入的包,不填无异于拒绝所有]
# _init_是跟all列表大同小异,是用来控制包的导入行为
# _all_控制模块的导入行为
from 包名 import *
模块名.目标
from mypackage import *
modulel.info_print1
14.7、异常
异常:当程序检测到一个错误时,解释器就无法继续执行,会出现一些错误的提示,这就是所谓的异常
实例:以r(读取)方式开一个不存在的文件。open(“test.txt”, “r”)
> 语法: try:
> 可能发生错误的代码 except:
> 如果出现异常执行的代码
快速体验:需求:尝试以r(read:读取)模式打开文件,如果文件不存在,则以w(写入) 方式打开。w(写入特点:当打开文件不存在会新建文件)
try:
file = open("test2.txt", "r") # file相当于是使用open打开的这个文件
except:
file = open("test2.txt", "w") # w写入,文件不存在会写入文件
file.close() # 关闭file文件
14.8、捕获异常
捕获异常语法:
try:
可能发生错误的代码
except:
异常类型:如果出现异常执行的代码
注意:
a、如果尝试执行的代码的异常类型和要捕获的异常类型不一致,则无法捕获异常。
b、一般try下方只放一行尝试执行的代码
例如
# 运行
print(eudg) # 会出现
NameError : name 'eudg' is not defined/名字错误:未定义名称“eudg”
异常类型 :异常描述信息
# 运行:
print(1 / 0) # 会出现
ZeroDivisionError: division by zero /零除错误:被零除
异常类型 :异常描述信息
a、捕获指定异常
try:
print(eudg)
except NameError:
print("代码错误,错误原因:名字错误")
# 结果:代码错误,错误原因:名字错误
b、捕获多个指定异常
try:
print(1 / 0)
except (NameError, ZeroDivisionError): # 当不确定异常类型时候可以except后接元组,将异常类型放入元组
print("代码错误,错误原因:")
# 结果:代码错误,错误原因:
c、捕获异常描述信息
try:
print(1/0)
except (NameError, ZeroDivisionError) as a: # as后变量可随意命名,符合命名规范即可
print(a)
结果:division by zero
d、捕获所有异常 Exception是所有程序异常类型的父类(包括所有异常)
try:
print(1/0)
except Exception as re:
print(re)
e、异常的else:如果没有异常需要执行的代码
捕获else异常语法:
try:
可能发生错误的代码
except:
异常类型:如果出现异常执行的代码
else:
print("代码无错")
try:
print(1)
except Exception as re:
print(re)
else:
print("代码无错")
# 结果:
>>> 1
>>> 代码无错
f、异常的finally
捕获异常语法:
try:
可能发生错误的代码
except:
异常类型:如果出现异常执行的代码
finally:
无论是否有异常,都可以去执行
try:
file = open("test2.txt", "r") # file相当于是使用open打开的这个文件
except:
file = open("test2.txt", "w") # w写入,文件不存在会写入文件
finally:
file.close() # 关闭file文件
14.9、异常的传递
需求:
. . . a、尝试只读方式®打开test2.txt文件,如果文件存在则读取文件内容,文件不存在则提示用户即可。
. . . b、读取内容要求:尝试循环读取内容,读取过程中如果检测到用户意外终止程序,则except捕获异常并提示用户
import time
try:
file1 = open("../day19文件操作/test2.txt", "r")
# 尝试循环读取内容
try:
while True:
com = file1.readline() # file1.readline() 表示对文件内容进行一行一行的读取
# 如果读取完成后退出循环
if len(com) == 0:
break
time.sleep(2)
print(com) # 验证方法,在命令提示符中运行代码,然后Ctrl + c,可以终止程序
except:
print("程序被意外终止!!!")
except:
print("该文件不存在")