条件判断
程序经常需要根据数据做决定:成绩达到 60 分才算及格,用户登录后才显示个人页面,库存不足时提示补货。Python 使用 if、elif 和 else 表达这些分支。
if 的基本结构
age = 20
if age >= 18:
print("可以进入")
条件后必须写冒号,下一行缩进的代码块称为 suite。Python 通常使用 4 个空格缩进,同一个代码块必须保持一致。条件为真时执行缩进块,为假时跳过。
if ... else
需要在两条路径中选择时使用 else:
score = 56
if score >= 60:
print("及格")
else:
print("需要补考")
else 不写条件,只表示“前面所有条件都不满足”。
if ... elif ... else
多个互斥区间可以按顺序使用 elif:
score = 86
if score >= 90:
level = "优秀"
elif score >= 80:
level = "良好"
elif score >= 60:
level = "及格"
else:
level = "不及格"
print(level)
Python 从上到下检查条件,执行第一个为真的分支后就结束整个链。顺序很重要:如果把 score >= 60 放在最前面,86 分会提前匹配“及格”。
可以省略 else,表示其他情况不需要操作:
if temperature < 0:
print("注意结冰")
比较运算
比较表达式的结果是 True 或 False:
a, b = 3, 5
print(a == b) # 相等
print(a != b) # 不相等
print(a < b)
print(a <= b)
print(a > b)
print(a >= b)
字符串按 Unicode 码点比较,业务排序通常应使用明确的排序规则,不要依赖大小写或本地化字符的默认顺序:
print("apple" < "banana") # True
判断对象是否为 None 时使用 is:
result = None
if result is None:
print("尚未得到结果")
不要用 is 比较普通数字或字符串;is 比较对象身份,== 才比较值。
逻辑运算
and、or 和 not 可组合条件:
age = 22
has_ticket = True
if age >= 18 and has_ticket:
print("允许入场")
if age < 18 or not has_ticket:
print("不满足入场条件")
短路求值
and 遇到第一个假值就停止,or 遇到第一个真值就停止。这既能提高效率,也能保护后面的表达式:
user = {"name": "小林"}
if "name" in user and user["name"]:
print(user["name"])
这里只有确认键存在后,才读取 user["name"]。and 和 or 返回操作数本身,不一定是布尔值:
display_name = user.get("nickname") or user.get("name") or "访客"
真值判断
条件位置会自动把值转换为真或假。常见假值包括 False、None、0、"" 和空容器:
items = []
if not items:
print("列表为空")
直接写 if items: 通常比 if len(items) > 0: 更清晰。需要区分“没有值”和“值为零”时,不要只依赖真值:
count = 0
if count is not None:
print(f"数量已设置为 {count}")
条件表达式
简单的二选一可以使用条件表达式:
age = 17
message = "成年" if age >= 18 else "未成年"
print(message)
它的结构是 真值表达式 if 条件 else 假值表达式。如果嵌套多个条件,会降低可读性,此时应改回普通 if。
嵌套条件
一个条件块中可以再写条件:
is_member = True
amount = 120
if is_member:
if amount >= 100:
discount = 0.8
else:
discount = 0.9
else:
discount = 1.0
嵌套过深时,可以用逻辑运算合并条件,或提取函数,让每个分支只负责一个决定。
in、范围和模式组合
成员判断常用于列表、集合和字符串:
role = "editor"
if role in {"admin", "editor"}:
print("可以编辑")
连续范围使用 range():
age = 25
if age in range(18, 60):
print("处于工作年龄段")
range(18, 60) 包含 18,不包含 60。对于浮点数或非整数范围,应直接使用比较运算。
防御性处理输入
input() 返回字符串。转换输入时要考虑空值和格式错误:
text = input("请输入年龄:").strip()
if not text:
print("年龄不能为空")
else:
try:
age = int(text)
except ValueError:
print("请输入整数")
else:
if age < 0:
print("年龄不能为负数")
else:
print(f"明年 {age + 1} 岁")
分支负责表达业务规则,异常处理负责应对无法转换的输入,两者职责可以分开。
常见错误
忘记缩进或冒号
# if score >= 60 # SyntaxError:缺少冒号
# print("及格") # IndentationError:没有缩进
把多个独立 if 当作互斥分支
score = 95
if score >= 60:
print("及格")
if score >= 90:
print("优秀")
这会输出两行。如果只能选择一个结果,应使用 if/elif/else。
链式比较写错
Python 支持数学式链式比较:
age = 25
if 18 <= age < 60:
print("符合条件")
它等价于 age >= 18 and age < 60,不要写成 18 <= age < 60 == True 这类难读表达式。
练习
- 根据输入的分数输出“优秀、良好、及格或不及格”。
- 判断一个年份是否为闰年:能被 4 整除且不能被 100 整除,或者能被 400 整除。
- 判断用户名和密码是否都非空,并根据角色决定是否允许访问管理页面。
- 使用条件表达式输出一个数字的正负状态;再将它改写为普通
if。
小结
if、elif、else按顺序选择要执行的代码块,条件后要有冒号并正确缩进。==比较值,is None判断空值;and、or、not组合逻辑并支持短路求值。- 空字符串、空容器、零和
None通常是假值,直接写if value:更简洁。 - 条件表达式适合简单二选一,复杂规则应使用清晰的分支或函数。
- 处理用户输入时,先校验空值,再转换类型,并捕获可能的
ValueError。