Python从入门到精通秘籍十

一、Python之了解异常

当在Python中执行代码时,如果发生错误,就会抛出异常(Exception)。处理异常是编写健壮的代码的重要部分。Python提供了try-except语句来捕获和处理异常。

下面是使用Python代码详细讲解异常处理的例子:

# 1. 尝试执行可能会引发异常的代码块
try:
    num1 = int(input("请输入一个整数:"))
    num2 = int(input("请输入另一个整数:"))
    result = num1 / num2
    
    print("结果为:", result)

# 2. 捕获特定类型的异常
except ValueError:
    print("输入的不是有效的整数!")
    
except ZeroDivisionError:
    print("除数不能为零!")

# 3. 捕获其他类型的异常
except Exception as e:
    print("发生了未知错误:", str(e))

# 4. 如果没有发生异常,则执行这个代码块
else:
    print("没有发生异常!")

# 5. 不管是否发生异常,都会执行这个代码块
finally:
    print("程序执行完毕。")

在上面的代码示例中,我们首先尝试执行可能会引发异常的代码块。如果发生异常,Python会跳转到相应的except代码块,并执行与异常类型匹配的代码。如果没有匹配的except代码块,那么会跳转到通用的Exception类型的except代码块。

在异常处理过程中,还可以使用else代码块来处理没有发生异常的情况。无论是否发生异常,都会执行finally代码块。

通过合理处理异常,我们可以使程序在出现错误时不崩溃,并提供友好的错误提示信息,从而增强代码的稳定性和可靠性。

二、Python之异常捕获

当在Python中执行代码时,如果发生错误,就会抛出异常(Exception)。异常是Python语言处理错误和异常情况的一种机制。通过捕获异常,我们可以对错误进行处理,避免程序崩溃。

下面是使用Python代码详细讲解异常捕获的例子:

# 1. 尝试执行可能会引发异常的代码块
try:
    num1 = int(input("请输入一个整数:"))
    num2 = int(input("请输入另一个整数:"))
    
    result = num1 / num2
    
    print("结果为:", result)

# 2. 捕获特定类型的异常
except ValueError:
    print("输入的不是有效的整数!")
    
except ZeroDivisionError:
    print("除数不能为零!")

# 3. 捕获多个异常类型
except (TypeError, FileNotFoundError):
    print("发生了类型错误或文件不存在错误!")

# 4. 捕获所有类型的异常
except Exception as e:
    print("发生了未知错误:", str(e))

# 5. 获取异常信息
except ZeroDivisionError as e:
    print("除数不能为零!", str(e))

# 6. 如果没有发生异常,则执行这个代码块
else:
    print("没有发生异常!")

# 7. 不管是否发生异常,都会执行这个代码块
finally:
    print("程序执行完毕。")

在上述代码中,我们使用了try-except语句来捕获异常。首先,我们尝试执行可能引发异常的代码块。如果发生异常,Python会跳转到与异常类型匹配的except代码块,并执行其中的代码。如果没有匹配的except代码块,会继续向上查找,直到找到通用的Exception类型的except代码块。

在捕获异常时,可以根据具体情况使用特定的异常类型进行捕获,也可以使用元组同时捕获多个异常类型。此外,还可以通过as关键字获取异常对象,以便进一步处理或打印异常信息。

在异常处理过程中,可以使用else代码块处理没有发生异常的情况。不管是否发生异常,都会执行finally代码块中的代码,确保程序的某些操作无论是否成功都能得到执行。

通过合理捕获和处理异常,我们可以提高程序的稳定性和可靠性,避免由于错误导致的程序崩溃。

三、Python之异常的传递性

在Python中,异常可以在代码的不同层级之间传递。当一个异常没有在当前层级被捕获时,它会向上层级传递,直到找到匹配的异常处理程序或者到达顶层,如果仍未被捕获,则会导致程序崩溃。

下面是使用Python代码详细讲解异常传递性的例子:

# 1. 定义一个函数,该函数会抛出异常
def divide(x, y):
    try:
        result = x / y
        print("结果为:", result)
    except ZeroDivisionError:
        print("除数不能为零!")
        # 抛出新的异常
        raise ValueError("除数不能为零")

# 2. 调用函数,并捕获抛出的异常
try:
    divide(10, 0)
except ValueError as e:
    print("捕获到异常:", str(e))

# 3. 异常在多层级之间传递
def calculate():
    try:
        divide(10, 0)
    except ValueError as e:
        # 在函数内部重新抛出异常
        raise RuntimeError("发生了运行时错误") from e

try:
    calculate()
except RuntimeError as e:
    print("捕获到异常:", str(e))
    print("原始异常:", str(e.__cause__))

在上述代码中,我们首先定义了一个名为divide的函数。该函数尝试计算两个数的商,并在除数为零时抛出ValueError异常。在异常处理程序中,我们又抛出了一个新的ValueError异常,这样异常就会传递到调用该函数的地方。

在主程序中,我们调用divide函数,并捕获抛出的ValueError异常。通过捕获异常,我们可以处理异常或者获取异常的相关信息。

接下来,我们定义了一个名为calculate的函数,在其中调用了divide函数。在calculate函数内部,我们又捕获了ValueError异常,并重新抛出一个RuntimeError异常。这样,异常就会在多层级之间传递。

最后,在主程序中,我们捕获了RuntimeError异常,并打印出异常信息。通过__cause__属性,我们还可以访问原始的异常对象。

通过异常的传递性,我们可以在不同层级的代码中捕获和处理异常,从而实现对错误情况的处理和控制流程的管理。

四、Python之模块的概念和导入

在Python中,模块是一个包含了一些定义和语句的文件。通过使用模块,我们可以将代码分成多个文件,使得代码更加模块化、结构清晰,并且可以在不同的程序中共享和重复使用。

下面是使用Python代码详细讲解模块的概念和导入的例子:

假设我们有两个文件:math_operations.pymain.py

# math_operations.py

def add(x, y):
    return x + y

def subtract(x, y):
    return x - y

# main.py

# 1. 导入整个模块
import math_operations

result = math_operations.add(5, 3)
print(result)

result = math_operations.subtract(8, 2)
print(result)


# 2. 导入特定函数
from math_operations import add, subtract

result = add(5, 3)
print(result)

result = subtract(8, 2)
print(result)


# 3. 给模块指定别名
import math_operations as mo

result = mo.add(5, 3)
print(result)

result = mo.subtract(8, 2)
print(result)


# 4. 导入所有函数
from math_operations import *

result = add(5, 3)
print(result)

result = subtract(8, 2)
print(result)

在上述代码中,math_operations.py文件是一个模块,其中定义了两个函数:addsubtract。这些函数可以在其他文件中进行导入和使用。

main.py文件中,我们演示了不同的模块导入方式:

  1. 使用import语句导入整个math_operations模块。这样就可以通过math_operations.addmath_operations.subtract调用模块中的函数。

  2. 使用from ... import语句导入指定的函数。这样就可以直接使用addsubtract调用这些函数,无需加上模块名前缀。

  3. 使用import ... as语句给模块指定别名。这样就可以使用mo.addmo.subtract调用模块中的函数。

  4. 使用from ... import *语句导入模块中的所有函数。这样就可以直接使用addsubtract调用这些函数,无需加上模块名前缀。

通过模块的概念和导入,我们可以将代码组织得更好、更易于管理,并且可以重复使用已经定义好的功能。模块化的设计使得代码更加模块化、可读性更强,并且方便多人协作开发。

相关推荐
zongzi_4941 分钟前
二次封装的天气时间日历选择组件
开发语言·javascript·ecmascript
kikyo哎哟喂12 分钟前
Java 代理模式详解
java·开发语言·代理模式
duration~17 分钟前
SpringAOP模拟实现
java·开发语言
一条晒干的咸魚26 分钟前
【Web前端】实现基于 Promise 的 API:alarm API
开发语言·前端·javascript·api·promise
hence..28 分钟前
Vscode写markdown快速插入python代码
ide·vscode·python
就爱六点起43 分钟前
C/C++ 中的类型转换方式
c语言·开发语言·c++
我明天再来学Web渗透1 小时前
【SQL50】day 2
开发语言·数据结构·leetcode·面试
猫猫的小茶馆1 小时前
【C语言】指针常量和常量指针
linux·c语言·开发语言·嵌入式软件
DanielYQ1 小时前
LCR 001 两数相除
开发语言·python·算法
yngsqq1 小时前
037集——JoinEntities连接多段线polyline和圆弧arc(CAD—C#二次开发入门)
开发语言·c#·swift