目录
2.拓展语法1:try ... except ... else
3.拓展语法2:try ... except ... finally
在上一章中,我们学习了 Python 的基础 for 与 while 循环结构、分支判断语句,掌握了循环的基本写法以及 break 与 continue 的基础作用。本章将在此基础上,深入探讨循环的扩展语法——for/while ... else 结构,详细解析 break 与 continue 对循环 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.两个关键字基础作用
break:直接终止当前所在整层循环,立刻跳出循环结构,后续循环全部不再执行;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 ... else、break 与 continue 三种语法,并观察它们对循环 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 的阻断作用
三、错误与异常基础区分
在编写、运行代码时,两类问题会导致程序无法正常运行,概念完全不同:
- 语法错误(编写错误)
书写格式违规,比如缺少冒号、缩进错乱、引号不匹配。代码运行前解释器就能检测,程序直接无法启动
例:if 3>2 print(1)缺少英文冒号 - 运行时异常(逻辑异常)
代码语法完全正确,但运行过程中数据不符合运算规则,程序中途崩溃
常见场景:除数为 0、输入文本却执行数字运算、调用不存在的变量
例:print(10 / 0)零除异常
异常处理 try-except 专门用来捕获运行时异常,防止程序直接终止退出
四、完整异常处理语法体系
在深入学习各语法之前,先通过下表快速对比三种异常处理结构的执行逻辑、适用场景与核心区别:
| 语法结构 | 执行逻辑 | 适用场景 | 核心区别 |
|---|---|---|---|
try-except | 先执行 try 代码;若抛出异常则跳转执行 except,否则跳过 except。 | 捕获并处理运行时异常,防止程序崩溃。 | 最基础结构,只负责捕获异常并给出处理。 |
try-except-else | 在 try-except 基础上增加 else 分支,仅当 try 无任何异常时执行。 | 需要区分“正常执行”与“异常处理”两种路径。 | else 只在无异常时运行,适合正常结果后的额外操作。 |
try-except-finally | 在 try-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 | 传入的参数类型正确,但取值不符合要求,例如把非数字字符串转换为整数。 | | |
TypeError | 对不支持该操作的数据类型执行运算,例如字符串与整数直接相加。 | | |
IndexError | 通过下标访问列表、元组等序列时,下标超出其有效范围。 | | |
KeyError | 使用字典中不存在的键进行访问。 | | |
ZeroDivisionError | 除数为 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("程序执行完毕,收尾操作运行")
4.拓展对比:C 语言与 Python 异常机制
很多初学者在接触 Python 的 try-except 后,会好奇 C 语言是如何处理错误的。事实上,C 语言并没有内置的异常处理机制,它主要依靠返回值、错误码和 errno 全局变量来传递错误信息;而 Python 则提供了完整的异常对象体系。下面通过对比表帮助理解两者的设计差异:
| 对比维度 | C 语言 | Python |
|---|---|---|
| 错误处理方式 | 通过函数返回值或 errno 错误码判断是否出错。 | 通过抛出(raise)与捕获(try-except)异常对象处理错误。 |
| 是否中断程序 | 出错后由程序员手动检查返回值,程序不会自动跳转。 | 异常抛出后立即中断当前代码块,跳转到匹配的 except 分支。 |
| 错误信息携带 | 通常只返回一个整数错误码,具体含义需查表或文档。 | 异常对象可携带类型、错误消息等丰富信息,便于定位问题。 |
| 资源清理 | 需要程序员手动释放内存、关闭文件,遗漏易造成泄漏。 | 配合 finally 或 with 语句可保证收尾代码必定执行。 |
| 典型示例 | | |
从对比可以看出:C 语言把错误处理的责任交给程序员,代码中需要大量手动判断;而 Python 将错误封装为异常对象,配合 try-except-finally 可以让错误处理逻辑更集中、更清晰。这也是 Python 在快速开发与教学场景中更受青睐的原因之一
五、实战练习题
下面提供 3 道综合练习题,覆盖循环 else、break / 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-finally 和 while 循环
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 终止循环的作用
六、本章核心总结
for、while均可搭配else,仅循环自然完整结束时执行else;break终止整层循环,continue仅跳过单次循环;- 区分语法错误与运行时异常:语法错误程序直接无法启动,异常是运行中途出错;
- 异常处理三层语法:基础
try-except、无异常分支else、必执行收尾finally; - 可指定异常类型精准捕获错误,提升程序容错能力,避免输入、运算错误直接导致程序崩溃

306

被折叠的 条评论
为什么被折叠?



