• Python异常、模块与包


    目录

    1. 异常

    1.1 了解异常

    1.2 捕获异常

    1.3 异常的传递

    2. 模块

    2.1 模块的概念与导入

    2.2 自定义模块与导入

    2.3 自定义Python包

    2.4 第三方包

    2.5 综合案例


    1. 异常

    1.1 了解异常

    异常就是程序运行的过程中出现了错误。

    bug就是指异常的意思,因为历史因为小虫子导致计算机失灵的案例,所以延续至今,bug就代表软件出现错误。

    1. # 只读方式打开一个不存在的文件
    2. f = open("abc.txt","r",encoding="utf-8")

    1.2 捕获异常

    1.为什么要捕获异常?

    在可能发生异常的地方,进行捕获。当异常出现的时候,提供解决方式,而不是任由其导致程序无法运行。

    2.捕获异常的语法:

    3.如何捕获异常

    • 捕获所有异常:
      • except:
      • except Exception:
    • 捕获指定的异常:
      • except NameError
    • 捕获多个异常:
      • except (NameError,ZeroDivisionError,...):
    1. # 基本捕获语法
    2. try:
    3. f = open("abc.txt","r",encoding="utf-8")
    4. except:
    5. print("出现异常了,因为文件不存在")
    6. f = open("abc.txt", "w", encoding="utf-8")
    7. # 捕获指定的异常
    8. try:
    9. print(name)
    10. except NameError as e:
    11. print("出现了变量未定义的异常")
    12. # name 'name' is not defined
    13. print(e)
    14. # 捕获多个异常
    15. try:
    16. print(name)
    17. 1 / 0
    18. except (NameError,ZeroDivisionError) as e:
    19. print("出现了变量未定义或者除以0的异常")
    20. # 捕获所有异常
    21. try:
    22. f = open("123.txt","r",encoding="utf-8")
    23. except Exception as e:
    24. print("出现异常了")
    25. f = open("123.txt", "w", encoding="utf-8")
    26. else:
    27. print("无异常,好高兴")
    28. finally:
    29. f.close()

    1.3 异常的传递

    异常是具有传递性的。

    1. # 定义一个出现异常的方法
    2. def func1():
    3. print("func1开始执行")
    4. num = 1 / 0
    5. print("func1结束执行")
    6. # 定义一个无异常的方法,调用上面的方法
    7. def func2():
    8. print("func2开始执行")
    9. func1()
    10. print("func2结束执行")
    11. # 定义一个方法,调用上面的方法,捕获异常
    12. def main():
    13. try:
    14. func2()
    15. except Exception as e:
    16. print(f"出现异常了,异常的信息是:{e}")
    17. main()

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

    注意:当所有函数都没有捕获异常的时候, 程序就会报错

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

    2. 模块

    2.1 模块的概念与导入

    1.什么是模块

    模块就是一个Python代码文件,内含类、函数、变量等,我们可以导入进行使用。

    2.如何导入模块

    3.注意事项

    • from可以省略,直接import即可。
    • as别名可以省略。
    • 通过“.”确定层级关系。
    • 模块的导入一般写在代码文件的开头位置。

    2.2 自定义模块与导入

    1. 如何自定义模块并导入?

    在Python代码文件中正常写代码即可,通过import、from关键字和导入Python内置模块一样导入即可使用。

    2. __main__变量的功能是?

    if __name_ == “__main__”表示,只有当程序是直接执行的才会进入if内部,如果是被导入的,则if无法进入。

    3. 注意事项

    • 不同模块,同名的功能,如果都被导入,那么后导入的会覆盖先导入的。
    • __all__变量可以控制import *的时候哪些功能可以被导入。

    2.3 自定义Python包

    1. 什么是Python的包?

    包就是一个文件夹,里面可以存放许多Python的模块(代码文件),通过包,在逻辑上将一批模块归为一类,方便使用。

    2. __init__.py文件的作用?

    创建包会默认自动创建的文件,通过这个文件来表示一个文件夹是Python的包,而非普通的文件夹。

    3. __all__变量的作用?

    同模块中学习到的是一个作用,控制 import * 能够导入的内容。

    举例 

     my_module1.py

    1. def info_print1():
    2. print("我是模块1功能函数的代码")
    3. # 只有程序是直接执行的才会进入if内部
    4. if __name__ == '__main__':
    5. info_print1()

    my_module2.py

    1. def info_print2():
    2. print("我是模块2功能函数的代码")

    __init__.py

    1. # 控制 import * 只能够导入my_module1
    2. __all__ = ["my_module1"]

    test_my_module.py

    1. # 创建一个包my_package
    2. # 导入自定义的包中的模块并使用
    3. # 方式一
    4. import my_package.my_module1
    5. import my_package.my_module2
    6. my_package.my_module1.info_print1()
    7. my_package.my_module2.info_print2()
    8. # 方式二
    9. from my_package import my_module1
    10. from my_package import my_module2
    11. my_module1.info_print1()
    12. my_module2.info_print2()
    13. # 方式三
    14. from my_package.my_module1 import info_print1
    15. from my_package.my_module2 import info_print2
    16. info_print1()
    17. info_print2()
    18. # 通过_all_变量,控制import *
    19. from my_package import *
    20. my_module1.info_print1()
    21. # my_module2.info_print2()

    2.4 第三方包

    1. 什么是第三方包?有什么作用?

    第三方包就是非Python官方内置的包,可以安装它们扩展功能,提高开发效率。

    2. 如何安装?

    • 在命令提示符内:
      • pip install 包名称
      • pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名称
    • 在PyCharm中安装

    2.5 综合案例

     

    str_util.py

    1. """
    2. 字符串相关的工具模块
    3. """
    4. def str_reverse(s):
    5. """
    6. 字符串反转
    7. :param s: 将被反转的字符串
    8. :return: 反转后的字符串
    9. """
    10. return s[::-1]
    11. def substr(s,x,y):
    12. """
    13. 字符串切片
    14. :param s: 将被切片的字符串
    15. :param x: 切片的起始下标
    16. :param y: 切片的结束下标
    17. :return: 切片后的字符串
    18. """
    19. return s[x:y]
    20. # 用于测试
    21. if __name__ == '__main__':
    22. print(str_reverse("黑马程序员"))
    23. print(substr("黑马程序员",1,3))

    file_util.py

    1. """
    2. 文件处理相关的工具模块
    3. """
    4. def print_file_info(file_name):
    5. """
    6. 打印文件全部内容
    7. :param file_name: 文件路径
    8. :return: None
    9. """
    10. fr = None
    11. try:
    12. fr = open(file_name,"r",encoding="utf-8")
    13. content = fr.read()
    14. print("文件全部内容如下:")
    15. print(content)
    16. except Exception as e:
    17. print(f"程序出现异常了,原因是:{e}")
    18. finally:
    19. # 如果变量是None,表示False,否则表示True
    20. if fr:
    21. fr.close()
    22. def append_to_file(file_name,data):
    23. """
    24. 将数据追加写入到文件中
    25. :param file_name:文件路径
    26. :param data: 要追加写入的数据
    27. :return: None
    28. """
    29. fa = open(file_name,"a",encoding="utf-8")
    30. fa.write(data)
    31. fa.write("\n")
    32. fa.close()
    33. # 用于测试
    34. if __name__ == '__main__':
    35. print_file_info("F:/test.txt")
    36. append_to_file("F:/test.txt","好好学习")

    综合案例.py

    1. import my_utils.str_util
    2. from my_utils import file_util
    3. print(my_utils.str_util.str_reverse("123456"))
    4. print(my_utils.str_util.substr("0123456",2,4))
    5. file_util.print_file_info("F:/abc.txt")
    6. file_util.append_to_file("F:/abc.txt","hello world")

    实际开发中,我们经常需要创建好不同的包,在每个包中编写同类的模块,这样在使用时直接导入模块再调用函数即可。

  • 相关阅读:
    基于Matlab实现连续模型求解方法
    FreeSWITCH rtp 统计
    StackOverflowError和OutOfMemoryError区别
    12c++呵呵老师【变量,定时器和事件】
    网络安全大厂面试真题库(求职必备!)
    基于matlab实现的光折射反射(不同界面)程序
    2024牛客寒假算法基础集训营4(视频讲解题目)
    2021年中国研究生数学建模竞赛C题——帕金森病的脑深部电刺激治疗建模研究
    Android TextView富文本SpannableStringBuilder的使用详解
    docker常用配置以及命令
  • 原文地址:https://blog.csdn.net/m0_60121089/article/details/127779631