条件控制
约 1581 字大约 5 分钟
2025-04-04
if 是 Python 最基础的分支结构,靠缩进表达从属关系。这一节既覆盖 if/elif/else 基本写法、真值测试、三元表达式,也讲 3.10 之后引入的 match-case 结构匹配,以及“早 return”这种降低嵌套的工程习惯。
- if / elif / else 与缩进规则
- 真值测试 (if x: 而不是 if x is True)
- 三元表达式 x if cond else y
- match-case 结构匹配 (3.10+)
- 早 return 减少嵌套
- 1把一段 if score >= 60: ... else: ... 改成三元表达式 result = ';及格' if score >= 60 else ';不及格'。
- 2故意混用 Tab 和 4 空格缩进,看到 IndentationError 或 TabError,记牢“同一块只用一种”。
- 3对空列表 []、空字符串 ''、0、None 跑 if x,体会真值测试,省掉 if len(x) > 0 这种啰嗦写法。
- 4在 Python 3.10+ 上用 match-case 写一段“按命令分发”的代码,对比同样逻辑的 if/elif 看可读性。
- 5把多层嵌套 if(金字塔代码)改成早 return:失败条件先 return,留下主流程在外层平铺。
条件语句是一种通过判断特定条件是否成立,从而决定程序下一步操作的逻辑结构。简单来说,就是“如果……就……”。例如:如果是天气很热,就喝一瓶冰可乐。
在 Python 中,流程控制语句中最常用的关键字是 if。Python 使用冒号 : 表示语句块的开始,并强制通过缩进来体现代码之间的从属关系。通常建议使用 4 个空格 作为一次缩进(这也是 PEP 8 推荐的标准),应避免混用 Tab 和空格。
基本语法
单 if 语句是最简单的流程控制结构,仅在条件成立时执行代码。其基本格式如下:
if 条件:
缩进 结果具体示例:
python playground
weather = "很热"
if weather == "很热":
print("喝一瓶冰可乐")
print(weather)当变量 weather 的值为 "很热" 时,程序会输出“喝一瓶冰可乐”。即使条件不成立,最后一行 print(weather) 也会执行,因为它不属于 if 代码块(没有缩进)。
双向判断 (if-else)
if-else 结构允许我们在条件成立和不成立时分别执行不同的代码。
if 条件:
缩进 结果
else:
缩进 结果具体示例:
python playground
score = 59
if score >= 60:
print("及格")
else:
print("不及格")
print("考试结束")多向判断 (if-elif-else)
当需要处理多个互斥条件时,可以使用 if-elif-else 结构。一旦某个条件满足,对应的代码块被执行,后续条件将不再检测。
if 条件1:
缩进 结果1
elif 条件2:
缩进 结果2
elif 条件3:
缩进 结果3
else:
缩进 默认结果具体示例:
python playground
age = 20
if age < 12:
print("儿童票")
elif age < 18:
print("学生票")
elif age < 65:
print("成人票")
else:
print("老年票")在这个例子中,程序会从上到下依次判断。只要满足一个条件,就会执行对应分支并结束判断。
嵌套语句
在 if 语句内部还可以包含其他的 if 语句,这称为嵌套。嵌套可以处理更复杂的逻辑,但过深的嵌套会降低代码可读性。
示例:电商平台的会员折扣逻辑。
python playground
is_member = True
order_amount = 200
if is_member:
if order_amount >= 100:
print("会员满100,享受8折")
else:
print("会员不满100,享受9折")
else:
print("非会员,原价购买")真值检测
在 Python 中,条件判断不仅仅局限于布尔值 True 或 False。许多对象在布尔上下文中都有默认的真假值:
- 被视为 False 的值:
None、False、数字0、空序列(如空字符串""、空列表[]、空元组())、空字典{}。 - 被视为 True 的值:除了上述情况外,几乎所有值都默认为 True。
这意味着我们可以写出更简洁的代码:
python playground
users = []
if users:
print("用户列表不为空")
else:
print("用户列表为空") # 会执行这就话,因为空列表被视为 False条件表达式 (三元运算符)
Python 支持一种简洁的单行条件表达式(类似其他语言的三元运算符),用于在赋值时根据条件选择值。
格式:value_if_true if condition else value_if_false
示例:
python playground
a = 10
b = 20
max_val = a if a > b else b
print(max_val) # 输出 20这种写法非常适合简单的二选一赋值场景。
结构匹配 (match-case,Python 3.10+)
Python 3.10 引入了 match-case 语句(PEP 634),用来做结构匹配。它远不只是其他语言的 switch,重点在“按形状”匹配,而不仅按值:
python playground
def handle(command):
match command.split():
case ['quit']:
return '退出'
case ['load', filename]:
return f'加载 {filename}'
case ['save', *files] if files:
return f'保存 {files}'
case _:
return '未知命令'
print(handle('quit'))
print(handle('load report.csv'))
print(handle('save a.txt b.txt'))
print(handle('hello'))_ 是兜底通配,*name 捕获剩余,if 是守卫条件。除了列表,还能按字典 ({'key': value})、类(Point(x=0, y=0))、字面值(200、'ok')匹配。能力远超 if/elif 的等值比较,但只有 3.10+ 可用,旧版本依然只能写 if/elif 串。
早 return:减少 if 的嵌套层级
下面这种“金字塔”很难读:
def process(user):
if user is not None:
if user.is_active:
if user.has_permission:
# 真正要做的事
do_something(user)把“失败条件”尽早 return,把主流程留在外层,是工程上更受推崇的写法:
def process(user):
if user is None:
return
if not user.is_active:
return
if not user.has_permission:
return
do_something(user)层级浅、阅读时不需要回到 else 分支猜执行位置 —— 这是 if 写好的关键习惯之一。
- if 用缩进表达层级,PEP 8 推荐 4 空格,禁忌 Tab 和空格混用。
- 判空、判零都直接 if x:;只有判 None 用 is,判类型用 isinstance。
- 三元表达式 x if cond else y 适合简单二选一;超出这个范围还是写完整的 if/else 更清晰。
- match-case(3.10+)能做“结构匹配”,比 if 串更强大,但仍以 if/elif 为主流写法。
- 层数深时考虑早 return:把失败条件先排掉,主流程外层平铺,比金字塔好读。
版权所有
版权归属:Shuo Liu
