Python入门到精通(八)——Python异常、模块、包

Python异常、模块、包

一、异常

1、定义

2、捕获异常

(1)捕获常规异常

 (2)捕获指定异常

​编辑

(3)捕获多个异常

​编辑

(4)捕获全部异常

​编辑

(5)异常 else

(6)异常的 finally

3、异常的传递

二、模块

1、定义

2、模块导入的方式

3、自定义模块

 4、测试模块

三、包

1、自定义包

​编辑

2、安装Python包

四、综合案例


一、异常

1、定义

当检测到一个错误时,Python解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的“异常”, 也就是我们常说的BUG

2、捕获异常

(1)捕获常规异常

代码示例

# 捕获常规异常
try:
    f = open('F:/abc.txt', 'r', encoding='Utf-8')
except:
    print('出现异常了,将改为w模式')
    f = open('F:/abc.txt', 'w', encoding='Utf-8')
 (2)捕获指定异常
  • 如果尝试执行的代码的异常类型和要捕获的异常类型不一致,则无法捕获异常
  • 一般try下方只放一行尝试执行的代码

代码示例

# 捕获指定异常
try:
    print(name)
except NameError as e:
    print('出现变量未定义异常')
    print(e)  # name 'name' is not defined
(3)捕获多个异常

输出异常信息

代码示例

# 捕获多个异常,并输出异常信息
try:
    # print(name)
    print(1 / 0)
except (NameError, ZeroDivisionError) as e:
    print('出现变量未定义或除以0异常')
(4)捕获全部异常

代码示例

# 捕获全部异常
try:
    print(name)
    print(1 / 0)
except Exception as e:
    print('出现异常')
(5)异常 else

else表示的是如果没有异常要执行的代码。

代码示例

# 异常的else
try:
    print('hello')
except Exception as e:
    print('出现异常')
else:
    print('没有异常 嘿嘿')
(6)异常的 finally

finally表示的是无论是否异常都要执行的代码,例如关闭文件。

代码示例

# finally语法
try:
    f = open('F:/abc.txt', 'r', encoding='Utf-8')
except Exception as e:
    print('出现异常')
    f = open('F:/abc.txt', 'w', encoding='Utf-8')
else:
    print('没有异常 嘿嘿')
finally:
    print('有没有异常 我都执行')
    f.close()

3、异常的传递

函数func1中发生异常, 并且没有捕获处理这个异常的时候, 异常会传递到函数func2, 当func2也没有捕获处理这个异常的时候,main函数会捕获这个异常,  这就是异常的传递性.

# 调用一个有异常的方法
def func1():
    print('func1开始执行')
    num = 1 / 0
    print('func1结束执行')


# 定义一个无异常的方法调用上面的异常
def func2():
    print('func2开始执行')
    func1()
    print('func2结束执行')


# 定义个方法,调用上面方法
def main():
    try:
        func2()
    except:
        print("main结束执行")


main()

利用异常具有传递性的特点, 当我们想要保证程序不会因为异常崩溃的时候,就可以在main函数中设置异常捕获, 由于无论在整个程序哪里发生异常, 最终都会传递到main函数中, 这样就可以确保所有的异常都会被捕获

二、模块

1、定义

模块就是一个Python文件,里面有类、函数、变量等,我们可以拿过来用(导入模块去使用)

2、模块导入的方式

常用的组合形式如:

  • import 模块名

# 通过import导入time使用sleep功能(time中的所有功能都能用)
import time
print('你好')
time.sleep(3)  # 通过 。 就可以使用模块内部的全部功能
print('我好')
  • from 模块名 import 类、变量、方法等

# 使用from导入time功能(只能用sleep)
from time import sleep
print('你好')
sleep(3)
print('我好')
  • from 模块名 import *

# 使用 * 导入所有功能
from time import *
print('你好')
sleep(3)
print('我好')
  • as 定义别名

# 使用 as 给模块加上别名
import time as t
print('你好')
t.sleep(3)
print('我好')

# 使用 as 给功能加上别名
from time import sleep as sl
print('你好')
sl(3)
print('我好')

3、自定义模块

代码示例

python异常模块与包.py

# 自定义模块
# 引用自定义模块my_module1
import my_module1

my_module1.test(1, 2)  # 3
# 或
from my_module1 import test
from my_module2 import test
# 都有test时,后一个会覆盖前一个调用,pycharm中会高亮显示调用的语句
test(2, 3)  # -1

my_module1.py

def test_a(a, b):
    print(a + b)

my_module2.py

def test(a, b):
    print(a - b)

 4、测试模块

代码示例

python异常模块与包.py

# 测试模块
# __main__变量
from my_module1 import test_a  # 直接输出3
# __all__变量  列表,可以手动指定导入哪个模块
from my_module1 import *  # 只能用test_a

my_module1.py

# all作用在 * 上
__all__ = ["test_a"]


def test_a(a, b):
    print(a + b)


def test_b(a, b):
    print(a - b)

# 右键运行可以执行
if __name__ == '__main__':
    test_a(1, 2)
  • 导入多个模块的时候,且模块内有同名功能. 当调用这个同名功能的时候,调用到的是后面导入的模块的功能
  • 如果一个模块文件中有`__all__`变量,当使用`from xxx import *`导入时,只能导入这个列表中的元素
  • if __name__ == “__main__”表示,只有当程序是直接执行的才会进入if内部,如果是被导入的,则if无法进入

三、包

1、自定义包

包的作用:
     当我们的模块文件越来越多时,可以帮助我们管理这些模块, 包的作用就是包含多个模块,但包的本质依然是模块

      新建包后,包内部会自动创建`__init__.py`文件,这个文件控制着包的导入行为

代码示例
① 新建包`my_package`
② 新建包内模块:`my_module1` 和 `my_module2`
③ 模块内代码如下

my_module1.py

def info_print1():
    print('我是模块1')

my_module2.py

def info_print2():
    print('我是模块2')

导入包

# 自定义python包
# 创建一个包
# 导入自定义包中的模块,并使用
import my_package.my_module1
my_package.my_module1.info_print1()  # 我是模块1

from my_package import my_module2
my_module2.info_print2()  # 我是模块2

# 导入具体的功能
from my_package.my_module1 import info_print1
info_print1()  # 我是模块1

# 通过all变量控制import *
from my_package import *
my_module1.info_print1()  # 我是模块1
my_module2.info_print2()  # name 'my_module2' is not defined

2、安装Python包

(1)打开命令提示符程序,输入  pip install 包名称

(2)使用国内镜像,可参考之前的文章

四、综合案例

练习题

代码示例

file_util.py

def print_file_info(file_name):
    """
    功能:将给定路径的文件内容输出到控制台中
    :param file_name: 即将读取的文件路径
    :return: None
    """
    f = None
    try:
        f = open(file_name, 'r', encoding='UTF-8')
        content = f.read()
        print('文件的全部内容如下:')
        print(content)
    except Exception as e:
        print(f'程序出现了异常:{e}')
    finally:
        # 如果变量是None,就是False,有内容是True
        if f:
            f.close()


def append_to_file(file_name, data):
    """
    功能:将指定的数据追加到指定文件中
    :param file_name: 指定的文件的路径
    :param data: 指定的数据
    :return: None
    """
    f = open(file_name, 'a', encoding='UTF-8')
    f.write(data)
    f.write('\n')
    f.close()


if __name__ == '__main__':
    print_file_info('F:/学习资料/Python/黑马/资料/aaa.txt')
    append_to_file('F:/学习资料/Python/黑马/资料/aaa.txt', 'CSDN')

str_util.py

def str_reverse(s):
    """
    功能是将字符串完成反转
    :param s: 将被反转的字符串
    :return: 反转后的字符串
    """
    return s[::-1]


def substr(s, x, y):
    """
    功能是按照给定字符串的下标,完成给定字符串的切片
    :param s: 即将被切片的字符串
    :param x: 切片的开始下标
    :param y: 切片的结束下标
    :return: 切片完成后的字符串
    """
    return s[x:y]


if __name__ == '__main__':
    print(str_reverse('欢迎来到CSDN'))
    print(substr('欢迎来到CSDN', 1, 3))

Python异常模块与包.py

import my_utils.str_util
from my_utils import file_util

print(my_utils.str_util.str_reverse('CSDN'))  # NDSC
print(my_utils.str_util.substr('CSDN', 0, 4))  # CSDN

file_util.print_file_info('F:/学习资料/Python/黑马/资料/aaa.txt')
file_util.append_to_file('F:/学习资料/Python/黑马/资料/aaa.txt', 'CSDN')
  • 20
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值