Python 循环扩展语法与程序异常处理

目录

一、循环扩展:for / while 搭配 else 语法

1.for ... else 完整结构

2.while ... else 完整结构

二、break 与 continue 深度对比

1.两个关键字基础作用

2.两者对循环else的关键影响

案例1:循环内使用break,else不执行

案例2:循环内使用continue,else正常执行

3.综合计算题实操

三、错误与异常基础区分

四、完整异常处理语法体系

1.基础语法 try ... except

实操示例1:输入数字求立方,非法输入捕获提示

实操示例2:捕获指定「除零异常」

2.拓展语法1:try ... except ... else

3.拓展语法2:try ... except ... finally

五、实战练习题

练习1:质数判断与循环 else

练习2:输入校验与 continue 跳过

练习3:除零保护与 finally 收尾

六、本章核心总结


在上一章中,我们学习了 Python 的基础 forwhile 循环结构、分支判断语句,掌握了循环的基本写法以及 breakcontinue 的基础作用。本章将在此基础上,深入探讨循环的扩展语法——for/while ... else 结构,详细解析 breakcontinue 对循环 else 分支的关键影响。随后,我们将讲解 Python 完整的异常处理体系 try-except,涵盖基础语法、扩展结构以及常见内置异常类型,并通过大量实操案例与易错对比,帮助构建扎实的异常处理能力

一、循环扩展:for / while 搭配 else 语法

1.for ... else 完整结构

标准遍历循环拓展写法:

for 循环变量 in 遍历对象:
    循环体语句1
else:
    循环正常结束后执行语句2

核心规则:

仅当循环完整遍历全部元素、未被 break 提前终止时,才会执行 else 内的代码

如果循环中途触发 break 跳出,else 语句会直接跳过,不执行

示例演示:

# 无break,正常遍历,会执行else
for char in "PYTHON":
    print(char, end=" ")
else:
    print("\n循环完整遍历,正常退出")

2.while ... else 完整结构

条件循环同样支持 else 拓展,语法格式如下:

while 条件表达式:
    循环体语句1
else:
    条件为False、循环自然结束后执行语句2

规则与 for ... else 完全统一:

仅当条件判定为 False、循环自然终止时执行 else;若中途用 break 强制跳出,else 不会运行

需要特别强调的是:while ... else 中的 else 是在条件自然不成立时才执行,而不是循环一结束就执行——只要循环是被 break 提前终止的,即使循环体已经结束,else 同样不会运行,这一点与 for ... else 完全统一

示例演示:

n = 1
while n <= 5:
    print(n, end=" ")
    n += 1
else:
    print("\n条件不成立,循环正常结束")

二、break 与 continue 深度对比

1.两个关键字基础作用

  1. break:直接终止当前所在整层循环,立刻跳出循环结构,后续循环全部不再执行;
  2. continue:仅跳过本次循环剩余代码,直接进入下一次条件判断,循环不会终止

2.两者对循环else的关键影响

案例1:循环内使用break,else不执行
for a in "PYTHON":
    if a == "Y":
        break  # 提前中断循环
    print(a, end=" ")
else:
    print("\n正常退出")
# 输出:P ,无else内容

运行逻辑:遇到 break 强制终止循环,遍历未完成,else 代码跳过

案例2:循环内使用continue,else正常执行
for a in "PYTHON":
    if a == "Y":
        continue  # 仅跳过本次输出
    print(a, end=" ")
else:
    print("\n正常退出")
# 输出:P T H O N 正常退出

运行逻辑:continue 只跳过单次循环,整体遍历完整走完,循环自然结束,else 正常执行

3.综合计算题实操

题目:遍历 1~100 的所有整数,偶数累加、奇数累减,最终输出总和。要求综合运用 for ... elsebreakcontinue 三种语法,并观察它们对循环 else 分支的影响。其中 continue 用于跳过 10 的倍数(不参与累加与累减),break 用于在累加结果超过 200 时提前终止循环,else 分支在循环完整遍历后输出最终结果

# 初始化总和变量 s,用于存储最终计算结果
s = 0
# 遍历 1 到 100(包含 1,不包含 101)的所有整数
for i in range(1, 101):
    # 使用 continue 跳过 10 的倍数,不参与累加与累减
    if i % 10 == 0:
        continue
    # 使用 break 在累加结果超过 200 时提前终止循环
    if s > 200:
        break
    # 判断当前数字 i 是否为偶数
    if i % 2 == 0:
        # 如果是偶数,将其值累加到总和 s 上
        s += i
    else:
        # 如果是奇数,将其值从总和 s 中减去
        s -= i
else:
    # 循环完整遍历结束后,通过 else 分支输出最终结果
    print("循环完整遍历,最终总和为:", s)
# 运行结果:循环完整遍历,最终总和为: 50

运行逻辑:continue 跳过 10 的倍数,仅跳过单次循环,不影响整体遍历;break 用于在累加结果超过 200 时提前终止循环,一旦触发,else 分支将不会执行。由于本例中累加结果始终未超过 200,循环完整遍历了 1~100 全部整数,因此 else 分支正常执行并打印结果

大家可以尝试把 break 的判断条件改为 s > 0,观察 else 分支被跳过、最终结果不再输出的现象,从而直观理解 break 对循环 else 的阻断作用

三、错误与异常基础区分

在编写、运行代码时,两类问题会导致程序无法正常运行,概念完全不同:

  1. 语法错误(编写错误)
    书写格式违规,比如缺少冒号、缩进错乱、引号不匹配。代码运行前解释器就能检测,程序直接无法启动
    例:if 3>2 print(1) 缺少英文冒号
  2. 运行时异常(逻辑异常)
    代码语法完全正确,但运行过程中数据不符合运算规则,程序中途崩溃
    常见场景:除数为 0、输入文本却执行数字运算、调用不存在的变量
    例:print(10 / 0) 零除异常

异常处理 try-except 专门用来捕获运行时异常,防止程序直接终止退出

四、完整异常处理语法体系

在深入学习各语法之前,先通过下表快速对比三种异常处理结构的执行逻辑、适用场景与核心区别:

语法结构执行逻辑适用场景核心区别
try-except先执行 try 代码;若抛出异常则跳转执行 except,否则跳过 except捕获并处理运行时异常,防止程序崩溃。最基础结构,只负责捕获异常并给出处理。
try-except-elsetry-except 基础上增加 else 分支,仅当 try 无任何异常时执行。需要区分“正常执行”与“异常处理”两种路径。else 只在无异常时运行,适合正常结果后的额外操作。
try-except-finallytry-except 基础上增加 finally 分支,无论是否异常都必定执行。需要释放资源、关闭文件等收尾操作。finally 无论是否触发异常都会执行,保证收尾代码不遗漏。

1.基础语法 try ... except

try:
    可能产生异常的代码段
except [异常类型]:
    捕获异常后执行的处理代码

运行逻辑:

先执行 try 内部代码,若无异常,直接跳过 except

try 内抛出指定类型异常,立刻停止 try 代码,跳转执行 except 内容

实操示例1:输入数字求立方,非法输入捕获提示
try:
    # 使用 float() 函数将用户输入转换为浮点数
    n = float(input("请输入一个数字:"))
    # 计算输入数字的立方(3次方)并打印结果
    print("输入数字的3次方值为:", n ** 3)
except:
    # 如果 try 块中的代码出现任何异常(如输入非数字字符串),则执行此处
    print("输入错误,请输入合法数字!")
实操示例2:捕获指定「除零异常」
try:
    # 将变量 i 赋值为 0
    i = 0
    # 尝试执行除法运算:10 除以 i(此时 i 为 0)
    print(10 / i)
except ZeroDivisionError:
    # 捕获特定的 ZeroDivisionError 异常(除零错误)
    print("除数为0,产生除零错误")

拓展知识点:可以单独标注异常名称,实现精准捕获;不写异常名称则捕获全部运行时异常

下面列出 Python 中几种常见的内置异常类型,掌握它们有助于在 except 中实现精准捕获:

异常类型触发场景代码示例修复后的正确代码
ValueError传入的参数类型正确,但取值不符合要求,例如把非数字字符串转换为整数。
int("abc")  # ValueError
int("123")  # 123
TypeError对不支持该操作的数据类型执行运算,例如字符串与整数直接相加。
"a" + 1  # TypeError
"a" + str(1)  # "a1"
IndexError通过下标访问列表、元组等序列时,下标超出其有效范围。
lst = [1, 2, 3]
lst[5]  # IndexError
lst[2]  # 3
KeyError使用字典中不存在的键进行访问。
d = {"name": "Tom"}
d["age"]  # KeyError
d.get("age", "未知")  # "未知"
ZeroDivisionError除数为 0 时触发,是本章实操示例中已接触过的异常。
10 / 0  # ZeroDivisionError
10 / 2  # 5.0

在实际开发中,建议优先捕获具体异常类型,再根据业务需要决定是否使用不带类型的 except 兜底,从而兼顾代码的健壮性与可读性。需要特别警惕的是:只写 except 会捕获所有异常,包括内存崩溃、系统中断等未知错误,调试时难以定位 bug,因此工程开发中禁止单独使用裸 except

2.拓展语法1:try ... except ... else

else 分支仅在 try 代码无任何异常时执行,适合“正常运行后额外操作”场景

try:
    num = int(input("输入整数:"))
except:
    print("输入格式错误")
else:
    print("输入合法,数字两倍:", num * 2)

3.拓展语法2:try ... except ... finally

finally 分支无论是否触发异常、无论是否执行 break一定会执行,常用于关闭文件、释放资源等收尾操作

try:
    num = int(input("输入整数:"))
    print(10 / num)
except ZeroDivisionError:
    print("不能除以0")
finally:
    print("程序执行完毕,收尾操作运行")

很多初学者在接触 Python 的 try-except 后,会好奇 C 语言是如何处理错误的。事实上,C 语言并没有内置的异常处理机制,它主要依靠返回值、错误码和 errno 全局变量来传递错误信息;而 Python 则提供了完整的异常对象体系。下面通过对比表帮助理解两者的设计差异:

对比维度C 语言Python
错误处理方式通过函数返回值或 errno 错误码判断是否出错。通过抛出(raise)与捕获(try-except)异常对象处理错误。
是否中断程序出错后由程序员手动检查返回值,程序不会自动跳转。异常抛出后立即中断当前代码块,跳转到匹配的 except 分支。
错误信息携带通常只返回一个整数错误码,具体含义需查表或文档。异常对象可携带类型、错误消息等丰富信息,便于定位问题。
资源清理需要程序员手动释放内存、关闭文件,遗漏易造成泄漏。配合 finallywith 语句可保证收尾代码必定执行。
典型示例
#include <stdio.h>
#include <errno.h>
int main() {
int a = 10, b = 0;
if (b == 0) {
// 手动检查并返回错误码
printf("除数为0,错误码:%d\n", errno);
return -1;
}
printf("商为:%d\n", a / b);
return 0;
}
try:
    a = 10
    b = 0
    print("商为:", a / b)
except ZeroDivisionError:
    print("除数为0,产生除零错误")

从对比可以看出:C 语言把错误处理的责任交给程序员,代码中需要大量手动判断;而 Python 将错误封装为异常对象,配合 try-except-finally 可以让错误处理逻辑更集中、更清晰。这也是 Python 在快速开发与教学场景中更受青睐的原因之一

五、实战练习题

下面提供 3 道综合练习题,覆盖循环 elsebreak / continue 与异常处理的组合应用。建议先独立尝试编写,再对照解题思路检查

练习1:质数判断与循环 else

题目:输入一个正整数,判断它是否为质数(只能被 1 和自身整除)。要求使用 for ... else 结构,并处理非法输入(如负数、非数字)

try:
    num = int(input("请输入一个正整数:"))
    if num <= 1:
        print("不是质数")
    else:
        for i in range(2, num):
            if num % i == 0:
                print(num, "不是质数")
                break
        else:
            print(num, "是质数")
except ValueError:
    print("输入格式错误,请输入整数!")

解题思路:for 循环遍历 2 到 num-1,一旦发现能整除的因子就 break 跳出,此时 else 不会执行;若遍历完整仍未找到因子,循环自然结束,else 执行并判定为质数。外层用 try-except 捕获非数字输入

练习2:输入校验与 continue 跳过

题目:连续输入 5 个数字,要求:负数直接跳过不参与统计;输入非数字时提示错误并重新输入;最终输出有效数字的平均值。要求使用 while 循环、continue 和异常处理

total = 0
count = 0
while count < 5:
    try:
        n = float(input("请输入第 %d 个数字:" % (count + 1)))
        if n < 0:
            print("负数跳过,不计入统计")
            continue
        total += n
        count += 1
    except ValueError:
        print("输入格式错误,请重新输入!")
print("有效数字的平均值为:", total / count)

解题思路:continue 跳过负数,不增加有效计数;try-except 捕获非数字输入,让用户重新输入。只有成功录入合法数字才让 count 加 1,保证最终统计 5 个有效数字

练习3:除零保护与 finally 收尾

题目:循环读取用户输入的两个数字并求商,要求:捕获除零异常并提示;输入非数字时提示错误;无论结果如何,最终都打印“本次运算结束”。要求使用 try-except-finallywhile 循环

while True:
    try:
        a = float(input("请输入被除数:"))
        b = float(input("请输入除数:"))
        print("商为:", a / b)
    except ZeroDivisionError:
        print("除数不能为0!")
    except ValueError:
        print("输入格式错误,请输入数字!")
    finally:
        print("本次运算结束")
    choice = input("继续运算?(y/n):")
    if choice.lower() != "y":
        break

解题思路:except 分别捕获除零异常和输入格式异常;finally 保证每次运算后都执行收尾提示;外层 while True 配合 break 控制是否继续,体现 break 终止循环的作用

六、本章核心总结

  1. forwhile 均可搭配 else,仅循环自然完整结束时执行 else
  2. break 终止整层循环,continue 仅跳过单次循环;
  3. 区分语法错误与运行时异常:语法错误程序直接无法启动,异常是运行中途出错;
  4. 异常处理三层语法:基础 try-except、无异常分支 else、必执行收尾 finally
  5. 可指定异常类型精准捕获错误,提升程序容错能力,避免输入、运算错误直接导致程序崩溃

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值