跳到主要内容

条件判断

程序经常需要根据数据做决定:成绩达到 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 这类难读表达式。

练习​

  1. 根据输入的分数输出“优秀、良好、及格或不及格”。
  2. 判断一个年份是否为闰年:能被 4 整除且不能被 100 整除,或者能被 400 整除。
  3. 判断用户名和密码是否都非空,并根据角色决定是否允许访问管理页面。
  4. 使用条件表达式输出一个数字的正负状态;再将它改写为普通 if。

小结​

  • if、elif、else 按顺序选择要执行的代码块,条件后要有冒号并正确缩进。
  • == 比较值,is None 判断空值;and、or、not 组合逻辑并支持短路求值。
  • 空字符串、空容器、零和 None 通常是假值,直接写 if value: 更简洁。
  • 条件表达式适合简单二选一,复杂规则应使用清晰的分支或函数。
  • 处理用户输入时,先校验空值,再转换类型,并捕获可能的 ValueError。