我们这周学习Python的的三个小点 异常 模块 包
目录
异常
异常和错误的不同
我们在写Python的过程中会出现很多错误和异常
因为我也对错误和异常的定义不太清楚,所以就参考了官网的解释
1. 错误
从软件方面来说,错误是语法或是逻辑上的。语法错误指示软件的结构上有错误,导致不能被解释器解释或编译器无法编译。这些错误必须在程序执行前纠正。当程序的语法正确后,剩下的就是逻辑错误了。逻辑错误可能是由于不完整或是不合法的输入所致;在其他情况下,还可能是逻辑无法生成,计算,或是输出结果需要的过程无法执行。这些错误通常分别被称为域错误和范围错误。
当 Python 检测到一个错误时,解释器就会指出当前流已经无法继续执行下去,这时候就出现了异常。
2. 异常
对异常的最好描述是: 它是因为程序出现了错误而在正常控制流以外采取的行为。这个行为又分为两个阶段: 首先是引起异常发生的错误,然后是检测(和采取可能的措施)阶段。
总的来说,我觉得错误就是在打代码的时候出现的一些语法错误,逻辑错误
异常是在执行程序的时候由于代码的错误而报错
而异常也有很多的类型,举一些例子
TypeError 类型异常 1 + “2”
IndexError 索引异常 li = [1,2] print(li[2])
keyEorror 键异常
解决异常的方法
解决异常的方法有很多种:
①容错代码:允许错误
def fund(x,y):
if y != 0:
return (x/y)
return "除数不为零"
print(fund(2,1))
这里就是把y等于0这种异常给他考虑进去,这样就不会让程序报错
②异常捕获
def funa(x):
print(1/x)
try:
funa(0)
except Exception as e:
print(e)
格式为:
try:
可能要出现异常的代码
except 异常的类型 若+as +异常的别名 相当于给异常的专业名字起别名
print("要说的话 或者直接说别名,告诉别人的异常类型")
而后面可以接很多个except
要是不知道是什么类型的异常,则可以用上面代码写的 Exception 这个是万能异常
else 和 finally语句
else:不异常之后才会被执行的语句,跟在所有except后面
finally:无论异常与否都执行的语句,一定要放到最后,可以省略
主动抛出异常 raise
为什么要主动抛出异常呢?
举个例子
def funa(x):
print(f"你年龄{x}岁")
funa(-18)
这种就是典型的逻辑错误
我们可以把这种逻辑错误当做异常,并可以自创这个异常,并报错
接着抛出异常,在外面用try except 来捕获异常
def funa(age):
if age <= 0 or age >= 120:
raise ValueError("值错误")
else:
print(f"你已经{age}岁了")
try:
funa(-15)
except ValueError as e :
print(e)
在raise语句中,是自己创造了一个异常
①若不要下面try except语句,且调用funa(-14),则在运行过程中会报错,即有红字出现
这是因为异常没有被捕获
②若有下面的try except语句,则会捕获异常,这样我们在try下面的funa()输入值后
则会开始运行funa的代码,当满足条件后就产生异常,然后被捕获
输出except语句下的代码,提醒值有问题。
所以当我们要运行的时候,代码都要写在try这个大框架下面
这样才能及时捕捉到错误,返回提醒语句,且不会中断下面程序的运行
模块
什么是模块
一些重复性的代码全部写到一个文件里,接着别人用一些代码调用你文件的一些代码
那这个文件就叫做模块
而Python也有自己的内置模块,可以用import语句导入即可
还有就是第三方模块,相当于玩游戏要下不同的mol,需要下载
自定义模块就是自己新建的一个py语句
接下来是
导入的方法
一,全部的语句都要导入过来
①import 模块名 (导入模块)
其中 import 可以理解为导入的意思
而 import 模块名 这句代码就包含了 模块名里面的代码
除非后面会引用模块名的变量
我在一个叫caogao1的文件里编写下面的程序:
a = 10
def funa(x):
print("hello world")
print(x)
而在caogao2的一个新建文件里编写下面的代码
import caogao1
print(caogao1.a)
print(caogao1.funa(2))
因此出来的结果就是
10
hello world
2
说明可以调用其他文件的变量参数,和函数代码
全部导入的时候,要用导入的函数时,要在前面加 模块名.
②import 模块名 as 别名
这种就是给模块名一个别号,这是在模块名太长的时候就可以这么用,比较简便
这里就不多介绍
③import 模块名1 模块名2
即同时导入两个模块,这里也不多介绍
二,导入部分模块的内容
①from 模块名 import 函数名/变量名 (as 别名)
from 可以理解为从哪里的意思
在gaocao1文件的代码没变
在caogao2文件的代码变为
from caogao1 import a
print(a)
这个时候其他文件的变量就不用加 模块名.
②from 模块名 import*
这个时候就是和import一样,导入所有
__all__语句
在要被导入的文件里写
__all__ = ["a","fund"]
代表着我只能给别人展示这几个变量
这个可以保护隐私吧,具体怎么用我也不清楚
__name__语句
要是在要被导入的文件打出
print(__name__)
会输出__main__,这就代表着你上面的代码是在当前文件运行
而要是导入文件后,就不会出现这种情况
所有可以在被导入的文件里输入
a = 10
def funa(x):
print("hello world")
print(x)
if __name__ == "__main__":
print("这里的代码是在这个文件没被导出的情况下才执行的代码")
包
相当于文件夹,比模块更高一级的存在
在pycharm里创建包
在new之后点击 python package ,这个时候就会自动生成一个__init__.py的文件
库>包>模块
硬盘>文件夹>文件