Python基础语法速查:条件、循环与异常处理语句汇总
全面汇总Python中的条件判断、循环控制与异常处理语句。包含基础语法、执行流程图解、核心机制对比、常见易错陷阱及速查表,帮助开发者快速掌握Python控制流语句。
控制流语句是编写可执行程序的核心骨架。Python 通过条件分支实现逻辑分流、通过循环结构实现重复计算、通过异常处理机制保证程序在出现意外情况时的健壮性与可恢复性。本文梳理 Python 中 if/elif/else 条件语句、for/while 循环语句以及 try/except/else/finally 异常处理语句的标准写法、控制流向、关键差异与注意事项,提供清晰直接的速查参考。
一、条件判断语句(if / elif / else)
条件语句根据表达式计算出的布尔真假值决定后续执行路径。Python 使用缩进来界定代码块,不支持大括号包围语句。
1. 核心语法结构
标准的多分支判断结构包含一个起始 if、零个或多个中间 elif,以及可选的末尾兜底 else:
score = 85
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
else:
grade = "D"
print(f"最终等级为: {grade}")
当满足某个分支条件并执行其代码块后,整个 if-elif-else 结构立即终止,不再评估后续任何分支。
2. 三元条件表达式
对于简单的二选一取值场景,Python 支持单行条件表达式:值1 if 条件 else 值2。该表达式要求必须存在 else 分支:
status = "成年" if age >= 18 else "未成年"
3. Python 的真值测试规则(Truth Value Testing)
在 Python 中,条件表达式不强制要求必须是显式的 True 或 False。所有对象都可以隐式参与真值测试。下列对象在布尔上下文中求值结果均为假(Falsy):
- 常量:
None、False - 各类数值零:
0、0.0、0j、Decimal(0) - 空序列与空映射:空字符串
""、空元组()、空列表[]、空字典{}、空集合set()、range(0) - 定义了
__bool__()返回False或__len__()返回0的自定义类实例
关键机制对比:多分支 if-elif-else 与多个独立 if 语句
相同条件设定:输入变量 x = 15,需要验证其所属区间。
- 多分支
if-elif-else(互斥逻辑):各分支具备严格互斥性。一旦前面的if或elif为真,后续所有判断均被短路跳过,只执行命中首个分支的代码块。适合多选一的归类业务。 - 连续独立
if(全量执行):每一个if均为独立语句,解释器会无条件对每一个if条件进行计算求值。如果条件间存在交集,将引发多次覆盖赋值或重复副作用。当判断条件包含复杂函数调用或 I/O 查询时,连续if会产生显著性能损耗。
二、循环结构语句(for 与 while)
循环语句用于重复执行一段代码。Python 提供两类基本循环:以遍历可迭代对象为导向的 for 循环,以及以状态判断为导向的 while 循环。
1. for 循环与常用迭代模式
Python 的 for 循环实质上是“for-each”迭代器协议的实现,它依次从可迭代对象(列表、元组、字典、字符串、生成器等)中取出元素赋给变量,直到元素耗尽:
# 基础范围遍历
for i in range(1, 5):
print(f"数值: {i}") # 输出 1, 2, 3, 4
# 同时获取索引与值
fruits = ["apple", "banana", "cherry"]
for index, fruit in enumerate(fruits, start=1):
print(f"序号 {index}: {fruit}")
# 多序列并行遍历
prices = [5, 3, 10]
for fruit, price in zip(fruits, prices):
print(f"{fruit} 售价为 {price} 元")
2. while 循环
while 循环在进入循环前先评估布尔条件,若条件为 True 则执行循环体,重复这一过程直到条件变为 False:
count = 3
while count > 0:
print(f"倒计时: {count}")
count -= 1 # 必须存在促使条件走向终止的状态变更,避免死循环
3. 流程控制关键字:break 与 continue
continue:立即终止当前这一轮迭代,跳过循环体中剩余的代码,直接进入下一次循环条件的判定与迭代步。break:立即彻底终止并跳出当前循环体,执行循环结构之后的代码。
4. 循环专属的 else 子句
这是 Python 循环中独具特色但常被误解的语法。循环后面的 else 子句仅在循环正常执行完毕(即未被 break 提前打断)时执行。如果在循环过程中触发了 break,else 块将被跳过。此特性极其适合用于元素查找判定:
target = 7
numbers = [1, 3, 5, 9, 11]
for num in numbers:
if num == target:
print(f"找到目标元素: {target}")
break
else:
print(f"遍历结束,未在列表中找到 {target}")
关键机制对比:for 迭代与 while 循环的选型依据
相同任务设定:处理一批需要按顺序检验的数据项。
for循环(已知集合/有限范围):依托迭代协议(__iter__与__next__)。无需外部手动维护游标变量,自动处理索引推进与终止边界,杜绝越界与死循环风险。对于遍历容器、文件行、生成器,for是首选且符合 Pythonic 风格的方式。while循环(状态驱动/不确定次数):由动态布尔表达式主导。适合网络轮询、持续监听、等待外部事件触发等未知循环次数的场景。缺点是必须显式更新循环状态,一旦疏漏极易引发 100% CPU 占用的死循环。
三、异常处理语句(try / except / else / finally)
异常处理不仅用于防御代码崩溃,更是 Python 处理可预期分支的核心设计思想(EAFP 模式)。完整的异常处理由四个互补的子句构成。
1. 四段式语法架构
try:
file = open("data.txt", "r", encoding="utf-8")
content = file.read()
value = int(content.strip())
except FileNotFoundError as err:
print(f"文件不存在: {err}")
except ValueError as err:
print(f"数据解析失败,非有效整数: {err}")
except (OSError, IOError) as err:
print(f"系统 I/O 错误: {err}")
else:
print(f"数据加载解析成功,值为: {value}")
finally:
try:
file.close()
except NameError:
pass # file 未成功创建
print("资源释放阶段结束")
2. 各段职责与执行原则
try块:包含可能引发异常的目标代码。一旦某行代码触发异常,后续行直接中止,控制权交给except。except块:拦截匹配特定类型的异常并予以修复或记录。可声明多个分支,或使用元组except (TypeError, ValueError):同时捕获多种异常。else块:仅在try块内没有发生任何异常时执行。将无异常时的后续操作移入else,可以防止在try中混入过多代码,避免意外捕获不该捕获的异常。finally块:无论是否抛出异常、异常是否被捕获,甚至在try/except中存在return语句的情况下,finally块都必定执行。通常用于清理外部资源(关闭网络连接、释放文件句柄、清理数据库游标)。
关键机制对比:LBYL(事前防御)与 EAFP(事后捕获)
相同场景设定:从字典 user_data 中提取嵌套键 profile 并访问其 age 字段。
- LBYL(Look Before You Leap,先看后跳):通过连续的
if "profile" in user_data and "age" in user_data["profile"]:进行前置校验。在并发多线程环境或文件操作中,前置校验与实际读取之间存在时差,极易引发检查时至使用时竞态条件(TOCTOU);且增加了冗余的键查找开销。 - EAFP(Easier to Ask for Forgiveness than Permission,先斩后奏):直接执行访问并用
try ... except KeyError:兜底。在正常预期下几乎无额外开销,且由于操作直接原子化执行,天然规避了竞态隐患,属于官方高度推崇的 Pythonic 编写风格。
四、控制流常见陷阱与防御方案
陷阱 1:严禁使用裸 except:
直接写 except: 会拦截包括 KeyboardInterrupt(用户按 Ctrl+C 中断)和 SystemExit(程序退出)在内的所有系统级信号,导致程序无法正常被终端终止。务必使用明确的异常类,如 except Exception:,或精确定位到 except (ValueError, KeyError):。
陷阱 2:遍历中直接修改列表容器
在 for item in my_list: 循环体内直接执行 my_list.remove(item) 会改变列表底层的索引指针,导致后续某些元素被无预警跳过。若需过滤,应遍历原列表的切片副本 for item in my_list[:]:,或改用列表推导式重构 my_list = [x for x in my_list if condition(x)]。
五、控制流核心语法速查全景
6. 控制流语句速查对照表
| 控制语句 | 对应关键字 | 主要应用场景 | 核心注意事项 |
|---|---|---|---|
| 单分支/多分支条件 | if / elif / else |
根据不同互斥条件执行特定业务逻辑 | 分支遵循自上而下匹配,命中即短路;注意隐式真值转换 |
| 三元条件表达式 | x if cond else y |
紧凑的变量二选一赋值 | 必须具备 else 分支,不适合承载复杂副作用操作 |
| 集合/序列循环 | for ... in |
已知元素集合、切片、范围或生成器迭代 | 首选方案;禁止在循环中直接增删原列表元素 |
| 条件驱动循环 | while |
未知循环次数、依赖外部状态或事件触发 | 循环体内必须具备步进逻辑,防止出现死循环 |
| 循环中断与跳步 | break / continue |
提前终止循环或跳过本轮剩余语句 | break 会一并跳过循环的 else 子句 |
| 循环完成确认 | for/while ... else |
元素查找、搜索未命中兜底逻辑 | 仅在循环未被 break 打断时才被触发 |
| 异常捕获与恢复 | try / except |
拦截预期可能出现的运行时错误 | 严禁使用裸 except:,必须指定明确的异常类型 |
| 异常无害平稳区 | else(配合 try) |
仅在 try 顺利完成时执行 |
避免将后续无风险代码混入 try 导致误捕获 |
| 确定性资源清理 | finally |
文件关闭、网络断开、锁释放等收尾操作 | 无论是否有未处理异常或提前 return,均保证执行 |
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









