前言
在Python中,异常是指程序中发生了错误或异常情况的情况。当Python程序遇到无法处理的代码时,会自动生成相应的异常并引发错误。为了捕获这些异常,并在出现问题时执行特定的操作,可以使用异常处理机制。(包括以下几个术语:异常、抛出异常、处理异常、重新抛出异常)
Python中的包是一种组织Python模块的方式,它将代码划分为相关主题或功能。每个包都是一个装有相关模块和子包的目录,这些模块和子包在其内部共享命名空间。
创建一个包需要在文件系统中创建一个目录,并在该目录中放置一个名为 __init__.py
文件。这个文件是包的主要标识符,它可以包含任何初始化包或指定如何导入其他模块/子包的代码。
使用包的好处之一在于避免了命名冲突。通过将代码划分为多个模块和包,我们可以更容易地组织大型项目并管理其依赖关系,以及更容易地重用和维护代码。
1.异常
(1)异常的捕获
捕获异常是通过使用try-except语句进行的。try语句块包含可能引发异常的代码;如果引发了异常,程序会跳转到与其类型匹配的except语句块,并且可以在该块中处理该异常。
以下是Python中try-except语句的基本语法:
try:
# 代码段
except ExceptionType:
# 异常处理代码段
在上述代码中,try
后面的代码段是可能引发异常的代码;如果发生异常,控制权将转移到后面的except
块,其中ExceptionType
是异常的类型。
例如,下面是一个示例,演示如何使用try-except块捕获除以零错误:
try:
result = 10 / 0
except ZeroDivisionError:
print('除数为 0!')
这里,try
块中的代码试图将10除以0,这是一个明显的错误,在运行时抛出ZeroDivisionError
异常,然后控制流进入except
块。
Python还支持通过使用else
和finally
子句来扩展try
/except
块。else代码块中的代码在没有引发任何异常时执行。finally
代码块中的代码始终在try语句块退出之前执行(无论是否引发异常)。
以下是带有else
和finally
子句的try语句块的示例:
try:
# 可能引发异常的代码
except ExceptionType:
# 处理该异常的代码
else:
# 如果没有出现异常,则执行此处的代码
finally:
# 无论是否抛出异常,都会执行此处的代码段
(2)异常的传递性
异常可以被传递到程序堆栈的上层,这通常称为“异常传播”或“异常传递性”。
当Python代码中的某个操作引发异常时,该异常将传递到调用当前函数的代码。如果异常未在该代码中处理,则它将继续传递到更高层次的调用者,直到遇到一个能够处理它的try/except语句或到达主程序并使其停止。
以下是一个演示异常传递性的例子:
def main_function():
print("Main function starts.")
child_function()
print("Main function ends.")
def child_function():
print("Child function starts.")
try:
result = 10 / 0
except ZeroDivisionError:
print("Caught an exception.")
print("Child function ends.")
main_function()
在上述代码中,当child_function
尝试除以零时,将抛出ZeroDivisionError
异常。然后,这个异常将在child_function
中被捕获,并打印一条消息,但是它不会阻止控制流返回到main_function
,并且最终导致所有函数正常结束。
值得注意的是,如果遇到未经处理的异常并打算中止程序,则可以使用raise
语句手动触发异常。raise
语句允许显式引发特定类型的异常,并使程序停止执行,避免产生其他任何结果。
2.包
(1)模块的概念和导入
模块是一个包含Python代码的文件。它们可用于将代码组织成逻辑单元以便更好地重用和管理。
使用模块可以方便地将功能分组到不同的文件中,并确保在应用程序中只需导入需要的部分。此外,模块还避免了名称冲突,因为每个模块都有自己的命名空间。
Python有许多内置模块,如math、random等库,这些模块提供了广泛的功能。此外,Python还支持创建自定义模块,使您可以在自己的应用程序中共享代码。
要导入模块,可以使用Python中的import语句。例如:
import math
print(math.pi) # 输出圆周率,由math模块提供
这个例子演示了如何导入Python内置的math模块,并显示了如何在代码中使用该模块中的pi变量。
除了import语句之外,Python还支持其他导入语法,例如从模块中导入特定函数或变量,如下所示:
from math import pi
print(pi)
此示例仅从math模块中导入圆周率常量pi并打印其值。
还可以使用 as 关键字指定别名来导入模块或其中的特定功能,以更方便地引用它们,
import math as m
print(m.pi) # 使用别名 m 引用模块中的 pi
这个例子演示了如何将 math 模块导入为别名 m 并在代码中使用新的别名引用其中的变量。
(2)自定义模块
要创建和使用自定义模块,需要完成以下步骤:
1.创建一个包含Python代码的.py文件作为模块。
例如,假设我们有一个名为 my_module.py 的模块文件,其中包含如下代码:
def greet(name):
print(f"Hello, {name}!")
2.使用import语句将模块导入到你的代码中。
import my_module
my_module.greet("Bob") # 调用my_module模块中的greet函数
在这个例子中,我们导入了自定义模块my_module,然后调用它里面的greet()函数。
3.也可以从模块中导入特定函数或变量。
from my_module import greet
greet("Alice") # 导入函数并直接引用它
这个例子演示了如何只从my_module模块中导入greet函数,并直接引用它。这样做可以避免重复输入模块名称,提高代码效率。
注意,在创建模块时,应该尽可能保持模块代码的干净和可读性,以便其他人更容易理解和使用它们。同时,为模块编写文档字符串以清晰地记录其功能和用法是一个好习惯。
(3)自定义包
自定义包是一组Python模块和子包的集合,它们按照某种目录结构组织在一起。使用自定义包可以更好地组织和管理大型项目中的代码。
要创建自定义包,需要进行以下步骤:
1.创建一个目录作为包的根目录,并在该目录中放置一个名为__init__.py
的空文件。这个文件告诉Python该目录应该被视为一个包,而不仅仅是一个普通的目录。
例如,假设我们创建了名为my_package
的目录,并在其中创建了一个名为__init__.py
的空文件。
2.在包的根目录中创建一个或多个模块,并将它们保存在.py
文件中。
例如,我们在my_package
目录下创建一个名为my_module.py
的模块。
3.可以使用点号.
符号从包中的模块中导入函数和变量。
例如,在你的代码中导入my_package
中的my_module
模块中的greet()
函数,你可以这样写:
from my_package.my_module import greet greet("Alice")
在这个例子中,我们通过点号.
符号导入了来自my_package
包中的my_module
模块中的greet()
函数,然后在代码中直接引用它。
注意,包也支持递归嵌套子包,只需在包根目录中创建另一个子目录并再次添加__init__.py
。每个子包都可以包含其自己的模块和子包。
使用自定义包可以使代码更加模块化和清晰,以便更好地组织和复用。
(4)第三方包
第三方包是由Python社区以外的开发人员或组织创建的Python模块和可重复使用的代码库。这些包可以大大扩展Python的功能,让您能够轻松地实现各种任务,如文本处理、数据分析、Web应用程序开发等等。
要使用第三方包,您需要进行以下步骤:
- 在终端中使用pip或conda等包管理器安装所需的包。
例如,在终端中执行以下命令将安装numpy
包:
pip install numpy
- 在Python代码中导入所需的包,并使用其提供的函数和变量。
例如,在的代码中导入numpy
包并使用它的random.rand()
函数生成一个随机向量:
import numpy as np
x = np.random.rand(5)
print(x)
在这个例子中,我们导入了名为numpy
的第三方包,并使用其提供的random.rand()
函数生成了一个长度为5的随机向量x
。
请注意,在选择使用特定的第三方包时,建议您首先查看其文档和GitHub存储库,了解其功能、用法和支持的Python版本等信息,以确保其适合您的项目需求。此外,建议您只使用最新版本的第三方包,并定期升级以获得最新的功能和修复的漏洞。
此致与君共勉