1.8 异常 模块和包

了解异常

当我们的解释器运行时发生了一些没办法的操作,或者说bug,这就叫做异常。

异常的捕获方法

为什么需要捕获异常

在真实的工作生活中,我们所有的程序遇到BUG肯定不可能让他直接崩溃,也就是我们更希望遇到BUG可以做到对BUG进行提醒,然后让整个程序继续运行的这种情况,这就需要我们进行捕获异常。

捕获异常:提前假设某处会出现异常,做好提前准备,当真的异常出现的时候,就可以有后续的手段。

捕获常规的异常

基本语法:

try:
可能发生异常的代码
except:
如果出现异常执行的代码

样例:

try:
	f=open('python.txt','r',encoding="UTF-8")
except:
	f=open('python.txt','w',encoding="UTF-8")

显然当python.txt这个文件不存在的时候,就会发生异常,因为r的模式没办法新建一个文档,而调用w的话就可以解决异常。

捕获指定的异常

基本语法:

try:
出现的异常的代码
except 异常的类型 as 异常对象的变量:
如果出现异常执行的代码

样例:

try :
    print(name)
except NameError as e:
    print("出现了名字未定义的异常")
    print(e)

输出结果:
在这里插入图片描述
值得注意的是,每种异常都有其对应的名字,这种方法仅仅智能捕获对应的相对应的异常。

而e其实上就是对象,也就是异常的对象,这个后续会再进行讲解。

捕获多个异常

基本语法:

try:
出现的异常的代码
except (异常的类型1,异常的类型2) as 异常对象的变量:
如果出现异常执行的代码

样例:

try :
    print(1/0)
    print(name)
except (NameError,ZeroDivisionError) as e:
    print("出现了名字未定义的异常或者除数为零的异常")
    print(e)

输出结果:
在这里插入图片描述
值得注意的是,我们当检测到最上面的异常1/0的时候,就会直接跳到except当中,并不是等try内部的所有指令执行完。

捕获所有的异常

实际上第一种做法就是捕获所有的异常,但是下面还有一种做法也可以达到这一形式:

基本语法:

try:
出现的异常的代码
except Exception as 异常对象的变量:
如果出现异常执行的代码

样例:

try :
    print(name)
    print(1/0)
except Exception as e:
    print("出现了异常")
    print(e)

输出结果:
在这里插入图片描述

异常else

直接从样例中理解吧:

样例:

try :
    print('hello world')
except Exception as e:
    print("出现了异常")
else:
    print('我是else,没有异常的时候执行我')

输出结果:
在这里插入图片描述

异常的finally

直接从样例中理解吧:

样例:

try :
    print('hello world')
except Exception as e:
    print("出现了异常")
else:
    print('我是else,没有异常的时候执行我')
finally:
    print("无论出没出现异常,我都要来执行,一般用于文件的关闭什么的")

输出结果:
在这里插入图片描述

异常的传递

异常是具有传递性的,我们拿一个样例进行分析:

def fun1() :
    print('这是fun1的开始')
    print(1/0)
    print('这是fun1的结束')
def fun2() :
    print('这是fun2的开始')
    fun1()
    print('这是fun2的结束')
def main() :
    try:
        fun2()
    except Exception as e:
        print(e)
main()

输出结果:
在这里插入图片描述
我们可以看出,实际上异常是出现在fun1当中的,但是确是我们在main函数当中找出的异常错误,所以异常是具有传递性的。

提示:当所有的函数都没有捕获异常,程序就会报错。

Python模块

Python模块,实际上就是一个Python文件,以.py进行结尾。模块能定义函数,类和变量,模块里面也能包含可执行的代码。

模块的作用:
Python当中有很多模块,每一个模块都可以帮助我们快速的实现一些功能,比如实现和时间相关的功能就可以使用time模块,我们可以认为一个模块就是一个工具包,每一个工具包中都有各种不同的工具,来给我们进行使用。

模块的导入

基本的语法:

[from 模块名] import [模块|类|变量|函数|*][as 别名]
(*表示导入模块内的全部内容)

常用的组合形式是:

  1. import 模块名

  2. from 模块名 import 类/对象/方法等

  3. from 模块名 import *

  4. import 模块名 as 别名

  5. from 模块名 import 功能名(类/对象/方法) as 别名

  6. 样例:

import time
print('你好')
time.sleep(5)
print('再见')

输出结果:
在这里插入图片描述
在这里插入图片描述

会等待5秒,后续的不解释。

  1. 样例
from time import sleep
print('你好')
sleep(5)
print('再见')

值得注意的是,此时我们使用该方法就只需要使用其函数名即可,而不需要指出是哪一个模块里面的哪一个函数。

  1. 样例:
from time import *
print('你好')
sleep(5)
print('再见')
  1. 样例:
import time as tt
print('你好')
tt.sleep(5)
print('再见')
  1. 样例:
from time import sleep as sl
print('你好')
sl(5)
print('再见')

PS:值得注意的是模块的导入需要在开头的地方写。

自定义模块

实际上就是新建一个新的python文件,在内部定义相关函数,然后在你需要用到此函数的时候,你就可以import 该文件的名字,来引入该模块,从而使用其中的函数了,但值得注意的是文件命名规则也必须复合标识符的命名规则。

还有一点就是,我们在文件一种写了fun1,在文件2种写了fun1,然后在我们的主文件种用from 文件1 import fun1,和from 文件2 import fun1,两次调用同名文件,引入的函数就会是文件2当中的函数,实际上就是文件2当中引入的函数将文件1的函数覆盖了。

测试模块

在实际开发中,当一个开发人员写完一个模块后,为零让模块能够在项目中达到想要的效果,这个开发人员就会在这个py文件中添加上一些测试的信息。

格式:

if name == ‘main’:

def test (data1,data2):
    print(data1+data2)
    
# 下面的仅在当前文件中使用,其他导入该文件模块的不使用
if __name__ == '__main__':
    test(1,2)

_all_模块

基本语法:

all=[‘可以被外部引用的模块函数的名字’]

样例:

__all__=['test1']

def test1 (data1,data2):
    print(data1+data2)

def test2(data1,data2):
    print(data1-data2)

对应上面的这个文件中的函数来说,外部引用模块仅能引用test1函数,而不能引用test2的。(用*的方式,其他的和,all没关系,all仅针对于*)

Python包

包实际上就是一个文件夹,内部包含着 _init_.py的文件,和其他的py模块文件。包的本质还是模块。

而如果向引出包内所有模块函数,实际上就可以在_init_.py的文件中对于文件进行all约束。这里就不细讲了。

常见的第三方包:
科学计算中:numpy包
数据分析中常用的:pandas包
大数据计算中常用的:pyspark包、 apache-flink包
图形可视化常用:matplotlib包 、pyecharts包
人工智能常用: tensorflow包

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值