条件判断是程序实现逻辑决策的核心。在 Python 中,if 语句提供了三种基本结构,让代码能根据不同条件执行不同分支。本文通过语法演示、性能考量和完整案例,帮助你掌握 if 语句的正确用法和常见陷阱。
一、if 语句的三种基本结构
1. 单分支 if
当条件成立时执行一段代码,否则跳过。语法如下:- age = 20
- if age >= 18:
- print("成年")
复制代码 缩进规则:Python 用 4 个空格(或一个 Tab)表示代码块,同一块必须严格对齐。冒号不能省略。
if 后面会进行真值测试,所有对象都会被隐式转换为布尔值。假值包括:False、None、0、空字符串、空容器等;其他都是真值。- test_values = [True, False, None, 0, 0.0, "", [], (), {}, 1, "hello"]
- for v in test_values:
- if v:
- print(f"{v!r:15} → 真值")
- else:
- print(f"{v!r:15} → 假值")
复制代码 常见条件表达式可以是比较运算、成员检查(in)、身份检查(is)、逻辑组合(and/or)、函数调用、字符串方法、链式比较等。
2. 双分支 if-else
二选一时使用,条件为真执行 if 块,否则执行 else 块。- age = 16
- if age >= 18:
- print("进入网吧")
- else:
- print("未成年禁止")
复制代码 经典应用包括登录验证、数据校验、奇偶判断、文件存在检查等。
嵌套:if 或 else 内部可以再放 if 语句,但嵌套深度不宜超过三层,否则应考虑重构。- def classify_triangle(a, b, c):
- if a + b > c and a + c > b and b + c > a:
- if a == b == c:
- return "等边"
- elif a == b or b == c or a == c:
- return "等腰"
- else:
- return "普通"
- else:
- return "不是三角形"
复制代码
3. 多分支 if-elif-else
适合三个及以上互斥条件。elif 可以有任意多个,else 可选。执行逻辑是从上到下匹配第一个 True 条件并执行,不再检查后续条件。- 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"
复制代码 注意条件顺序:宽泛条件放在前面会导致后面的分支永远无法触发。
二、选型指南
如果只有一个条件需要满足时执行,用单分支 if。如果只有两种结果,用双分支 if-else。如果有多个互斥结果,用多分支 if-elif-else。
三、性能优化
1. 条件排列:把最可能命中、计算量最小的条件放前面,利用短路求值特性。
2. 如果 elif 分支非常多且只是简单的值到结果的映射,用字典代替 if-elif 更高效。- HTTP_STATUS = {
- 200: "成功",
- 404: "未找到",
- 500: "服务器内部错误",
- }
- def get_status_text(code):
- return HTTP_STATUS.get(code, "未知状态码")
复制代码
四、实战案例
1. BMI 计算器:根据体重和身高计算 BMI,用多分支给出健康建议。- def bmi_advice(weight, height):
- if height <= 0 or weight <= 0:
- return "无效输入"
- bmi = weight / (height ** 2)
- if bmi < 18.5:
- cat, adv = "偏瘦", "增加营养"
- elif bmi < 24:
- cat, adv = "正常", "保持"
- elif bmi < 28:
- cat, adv = "偏胖", "控制饮食"
- elif bmi < 32:
- cat, adv = "肥胖", "减重计划"
- else:
- cat, adv = "重度肥胖", "尽快就医"
- return {"bmi": round(bmi, 1), "category": cat, "advice": adv}
复制代码 2. 简易 ATM 取款机:演示三种结构综合应用——单分支检查输入,双分支判断余额,多分支给出余额建议。- class SimpleATM:
- def __init__(self, balance=1000):
- self.balance = balance
- def withdraw(self, amount):
- if amount <= 0:
- print("金额必须大于0")
- return False
- if amount > self.balance:
- print("余额不足")
- return False
- self.balance -= amount
- print(f"取款{amount},余额{self.balance}")
- if self.balance == 0:
- print("余额为零")
- elif self.balance < 100:
- print("余额不足100")
- return True
复制代码 3. 表单验证器:利用多个独立单分支分别收集错误,最后返回是否通过。- class FormValidator:
- def __init__(self, data):
- self.data = data
- self.errors = []
- def validate(self):
- if not self.data.get("username"):
- self.errors.append("用户名不能为空")
- elif len(self.data.get("username")) < 3:
- self.errors.append("用户名至少3字符")
- if not self.data.get("password"):
- self.errors.append("密码不能为空")
- elif len(self.data.get("password")) < 6:
- self.errors.append("密码至少6字符")
- email = self.data.get("email", "")
- if email:
- if "@" not in email or "." not in email.split("@")[-1]:
- self.errors.append("邮箱格式不正确")
- else:
- self.errors.append("邮箱不能为空")
- return (False, self.errors) if self.errors else (True, ["通过"])
复制代码
五、常见错误与最佳实践
错误 1:使用 = 代替 == 判等。
错误 2:忘记冒号。
错误 3:缩进不一致导致 IndentationError。
错误 4:冗余比较 if is_valid == True,应直接写 if is_valid。
错误 5:条件顺序不当导致分支死区。
错误 6:字符串当作布尔(if status == "active" or "pending" 总是为真),应使用 in 或显式比较。
最佳实践:
- 始终保持缩进一致(推荐 4 个空格)。
- 复杂条件先赋值到变量以提高可读性。
- 避免超过三层嵌套,可用逻辑组合或拆分成函数。
- 字典映射代替长 if-elif 链。
- 用 not 取代 == False。
掌握了 if 语句的三种结构,你就能让程序根据数据做出正确的决策。这些基础是后续学习循环、异常处理和复杂业务逻辑的基石。 |