异常的传递性|模块的概念和导入|自定义模块并导入
P93 异常的传递性
异常的传递
当函数func01中发生异常,并且没有捕获处理这个异常的时候,异常会传递到函数func02,当func02也没有捕获处理这个异常的时候main函数会捕获这个异常,这就是异常的传递性。
def func01():print("这是func01开始")num=1/0print("这是func01结束") # 异常在func01中没有被捕获
def func02():print("这是func02开始")func01()print("这是func02结束") # 异常在func02中没有被捕获
def main():try:func02() # 异常在main中被捕获except Exception as e:print(f"出现异常了,异常的信息是:{e}")main()
提示:
当所有函数都没有捕获异常的时候,程序就会报错。
P94 模块的概念和导入
什么是模块
python模块(Module),是一个python文件,以.py结尾。模块能定义函数,类和变量,模块里也能包含可执行的代码。
模块的作用:python中有很多各种不同的模块,每一个模块都可以帮助我们快速地实现一些功能,比如实现和时间相关的功能就可以使用time模块。
我们可以认为一个模块就是一个工具包,每一个工具包中都有各种不同的工具供我们使用进而实现各种不同的功能。
大白话:模块就是一个python文件,里面有类、函数、变量等,我们可以拿过来用(导入模块去使用)。
模块的导入方式
模块在使用前需要先导入 导入的语法如下:
[from 模块名] import [模块|类|变量|函数|*] [as 别名]
常用的组合形式如:
- import 模块名
- from 模块名 import 类、变量、方法等
- from 模块名 import *
- import 模块名 as 别名
- from 模块名 import 功能名 as 别名
import模块名
基本语法
import 模块名
import 模块名1,模块名2
模块名.功能名()
案例:导入时间模块
# 导入time模块
import time # 导入python内置的time模块(time.py这个代码文件)print("开始")
# 让程序睡眠1秒(阻塞)
time.sleep(1) # 通过.就可以使用模块内部的全部功能(类、函数、变量)
print("结束")
from 模块名 import 功能名
基本语法:
from 模块名 import 功能名
功能名()
案例:导入time模块中的sleep方法
# 使用from导入time模块使用sleep功能(函数)
from time import sleep
print("你好")
sleep(4)
print("我好")
from 模块名 import *
基本语法:
from 模块名 import *
功能名()
案例:
# 使用*号导入time模块的全部功能
from time import * # *表示全部的意思
print("你好")
sleep(3)
print("我好")
as定义别名
基本语法:
# 模块定义别名
import 模块名 as 别名# 功能定义别名
from 模块名 import 功能 as 别名
案例1:
# 使用as给特定功能加上别名
import time as t
print("你好")
t.sleep(2)
print("我好")
案例2:
from time import sleep as sl
print("你好")
sl(2)
print("我好")
P95 自定义模块并导入
制作自定义模块
python中已经帮我们实现了很多的模块。不过有时候我们需要一些个性化的模块,这里就可以通过自定义模块实现,也就是自己制作一个模块
案例:新建一个python文件,命名为my_module1.py,并定义test函数
# 自定义模块
def test(a,b):print(a+b)test(1,2)
# 导入自定义模块使用
import my_module1
my_module1.test(1,2)
from my_module1 import test
test(1,2)
注意:
每个python文件都可以作为一个模块,模块的名字就是文件的名字,也就是说自定义模块名必须需要符合标识符命名规则
注意事项:
# 模块1代码
def my_test(a,b):print(a+b)# 模块2代码
def my_test(a,b):print(a-b)# 导入模块和调用功能代码
from my_module1 import my_test
from my_module2 import my_test# my_test函数是模块2中的函数
my_test(1,1)
当导入多个模块(my_module1、my_module2)的时候,且模块内有同名功能(my_test),当调用这个同名功能的时候,调用到的是后面导入的模块的功能.
测试模块
在实际开发中,当一个开发人员编写完一个模块后,为了让模块能够在项目中达到想要的效果,这个开发人员会自行在py文件中添加一些测试信息,例如,在my_module1.py文件中添加测试代码test(1,1)
from my_module1 import test
如何想在my_module1中添加测试,但是又不想在调用的时候显示测试结果呢?
答案:在my_module1中添加如下语法,意思是:当运行my_module1的时候,test内置变量会变成__main__,结果为true,模块就会运行,并显示测试结果;但是在调用文件中运行,模块内置结果便没有变成__main__,模块的测试就不会执行。
__all__
如果一个模块文件中有“__all__”变量,当使用“from xxx import *”导入时,只能导入这个列表中的元素。
# 如果既调用testa又调用testb
from my_module1 import *
testa(1,2)
testb(2,1)
# 如果只调用testa
from my_module1 import *
testa(1,2)
但是手动import testb是可以的,因为__all__只作用在*上