条件语句
条件语句是控制程序执行流程的基础。Python 使用 if、elif、else 三个关键字来实现分支判断,配合缩进来划分代码块。掌握条件语句是写出有"判断力"的程序的第一步。
if 语句基本语法
if 语句后跟一个布尔表达式,当表达式为 True 时执行缩进的代码块:
age = 18
if age >= 18:
print("你已成年,可以进入。")
如果条件为 False,则跳过缩进代码块。注意 Python 使用缩进(通常 4 个空格)表示代码块层级,而不是大括号。
if-else 语句
使用 else 处理条件不成立的情况:
score = 55
if score >= 60:
print("及格")
else:
print("不及格")
else 不需要条件表达式,它会在前面所有 if 条件都不满足时执行。
if-elif-else 多分支
当存在多个互斥条件时,使用 elif(else if 的缩写)依次判断。一旦某个分支命中,后续分支将不再判断:
score = 85
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
elif score >= 60:
grade = "D"
else:
grade = "F"
print(f"成绩等级:{grade}") # 成绩等级:B
:::note 分支顺序很重要
elif 是从上到下顺序判断的。如果把宽松的条件放在前面,后面的严格条件将永远无法命中。例如先判断 score >= 60 再判断 score >= 90,那么 90 分也会被归入 60 分那一档。
:::
条件表达式(三元运算符)
Python 的三元运算符语法为 x if condition else y,可以在一行内完成简单的条件赋值:
age = 20
status = "成年" if age >= 18 else "未成年"
print(status) # 成年
它等价于:
age = 20
if age >= 18:
status = "成年"
else:
status = "未成年"
条件表达式还可以嵌套,但过度嵌套会降低可读性:
score = 75
result = "优秀" if score >= 85 else ("良好" if score >= 70 else "一般")
print(result) # 良好
:::tip 何时使用三元运算符
当赋值逻辑简单、仅两到三个分支时使用三元运算符能让代码更简洁。如果分支超过三层或涉及复杂表达式,建议改用 if-elif-else 语句。
:::
嵌套条件
if 语句内部可以再嵌套 if 语句,用于处理更复杂的判断逻辑:
age = 25
has_license = True
if age >= 18:
if has_license:
print("可以独自驾驶。")
else:
print("已成年,但需要先考取驾照。")
else:
print("未成年,不能驾驶。")
:::warning 避免过深嵌套
嵌套层数过多会降低代码可读性。一般建议嵌套不超过 3 层。可以通过提前 return、合并条件等方式扁平化逻辑。例如上面代码可改写为:
age = 25
has_license = True
if age < 18:
print("未成年,不能驾驶。")
elif has_license:
print("可以独自驾驶。")
else:
print("已成年,但需要先考取驾照。")
:::
真值测试
Python 中并非只有布尔值 True / False 能参与条件判断。下列值在 if 中被视为 假值(falsy):
FalseNone- 任何数值类型的 0:
0、0.0、0j - 空序列:
""、[]、()、range(0) - 空映射:
{} - 自定义对象中
__bool__()返回False或__len__()返回0的实例
其他所有值都视为 真值(truthy)。
name = ""
if name:
print(f"你好,{name}!")
else:
print("未输入姓名。") # 输出此行
items = [1, 2, 3]
if items:
print(f"列表非空,共 {len(items)} 个元素。")
:::tip 优雅地判断空容器
在 Python 中,判断列表/字符串/字典是否为空,推荐直接用 if container:,而不是 if len(container) > 0:。这种写法更 Pythonic,符合 PEP 8 建议。
:::
逻辑运算符组合条件
and、or、not 可以组合多个条件:
age = 25
has_id = True
if age >= 18 and has_id:
print("允许进入。")
temperature = 30
if temperature < 10 or temperature > 35:
print("极端天气,注意防护。")
if not has_id:
print("请出示证件。")
and 和 or 具有短路特性:
a and b:若a为假,则不再求值ba or b:若a为真,则不再求值b
# 利用短路特性安全访问
users = []
default = "匿名"
# 当 users 为空时,不会执行 users[0]
current = users[0] if users else default
print(current) # 匿名
实战:成绩等级判定
综合运用条件语句,编写一个完整的成绩等级判定程序:
def evaluate_score(score: float) -> str:
"""根据百分制成绩返回等级。
Args:
score: 0 到 100 之间的成绩。
Returns:
等级字符串及评语。
"""
if not 0 <= score <= 100:
return "成绩无效,应在 0~100 之间。"
if score >= 90:
grade = "A"
comment = "优秀"
elif score >= 80:
grade = "B"
comment = "良好"
elif score >= 70:
grade = "C"
comment = "中等"
elif score >= 60:
grade = "D"
comment = "及格"
else:
grade = "F"
comment = "不及格"
return f"等级 {grade}:{comment}"
# 测试用例
for s in (95, 82, 73, 60, 45, 120, -5):
print(f"{s:>4} -> {evaluate_score(s)}")
输出:
95 -> 等级 A:优秀
82 -> 等级 B:良好
73 -> 等级 C:中等
60 -> 等级 D:及格
45 -> 等级 F:不及格
120 -> 成绩无效,应在 0~100 之间。
-5 -> 成绩无效,应在 0~100 之间。
:::info 类型注解提示
上面代码使用了 score: float 和 -> str 类型注解。这是 Python 3.5+ 引入的语法,不会影响运行,但能让 IDE 提供更好的提示,也方便阅读。本教程面向 Python 3.12+,会大量使用类型注解。
:::
小结
- Python 用
if/elif/else实现分支判断,依靠缩进划分代码块。 elif分支是顺序判断的,命中一个就停止后续判断。- 条件表达式
x if cond else y适合简单的两分支赋值。 - Python 有丰富的真值/假值规则,可以直接对容器、字符串、
None进行真值测试。 - 用
and/or/not组合条件时注意短路特性。 - 避免嵌套过深,优先用提前返回或合并条件来扁平化逻辑。