python进阶,在第一期的基础上做了极大的优化,整体更加美观易懂
十四、模块和包、异常
14.1、模块了解,及基础
python模块(Module),是一个python文件,以.py结尾,包含了python对象定义和python语句。模块能定义函数,类和变量,模块里也能包含可执行的代码
导入模块的方式 . 1、导入math模块 . 2、调用模块内的sqrt()功能函数
1、 import 模块名
语法:
> import 模块名
> import 模块名1, 模块名2......
> 模块名.功能名()
import math
print(math.sqrt(16))
2、from 模块名 import 功能名
> 语法:from 模块名 import 功能1, 功能2, 功能3
from math import sqrt
print(sqrt(81))
3、 from 模块名 import *
语法:
> from 模块名 import *
from math import *
print(sqrt(49))
4、 as定义别名
语法:
> import 模块名 as 别名
> from 模块名 import 功能名 as 别名
小需求:运行后暂停2秒打印hello world!!!
a、 模块起别名
import time as q
q.sleep(2)
print("hello world!!!")
hello world!!!
b、功能函数起别名
from time import sleep as sd
sd(2)
print("hello world!!")
hello world!!
14.2、制作模块
定义模块:在python中,每个python文件都可以作为一个模块,模块的名字就是文件的名字。也就是说自定义模块名必须要符合标识符命名规则(4条)。
小需求:
def testA(a, b):
print(a + b)
testA(5, 9.99)
print(__name__)
if __name__ == "__name__":
testA(1, 4)
新建.py文件,调用模块
import my_modulel_1
my_modulel_1.testA(4, 5)
结果:9
14.3、模块定位顺序
搜索顺序:
1、当前目录
2、如果不在当前目录,python则搜索在PYTHONPATH下的每个目录。
3、如果都找不到,python会查看默认路径
注意:
a、自己的文件名不要和已有的模块名重复,否则导致模块功能无法使用
b、使用from 模块名 import 功能的时候,注意功能名字重复,调用到的是最后定义或导入的功能
def sleep():
print("这是一个导入的功能")
from time import sleep
sleep(2)
14.4、__all__列表
__all__右边接列表:作用,可以控制当前模块的导入行为
需求: 如果一个模块文件中有_all_变量,当使用from xx import *导入时,只能导入这个列表中的元素
__all__ = ["testA"]
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_=[],控制允许导入的模块列表,[中填允许导入的包,不填无异于拒绝所有]
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")
except:
file = open("test2.txt", "w")
file.close()
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):
print("代码错误,错误原因:")
c、捕获异常描述信息
try:
print(1/0)
except (NameError, ZeroDivisionError) as a:
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")
except:
file = open("test2.txt", "w")
finally:
file.close()
14.9、异常的传递
需求:
. . . a、尝试只读方式?打开test2.txt文件,如果文件存在则读取文件内容,文件不存在则提示用户即可。 . . . b、读取内容要求:尝试循环读取内容,读取过程中如果检测到用户意外终止程序,则except捕获异常并提示用户
import time
try:
file1 = open("../day19文件操作/test2.txt", "r")
try:
while True:
com = file1.readline()
if len(com) == 0:
break
time.sleep(2)
print(com)
except:
print("程序被意外终止!!!")
except:
print("该文件不存在")
|