在 Python 3 中,条件控制(Conditionals)是程序做出决策的核心机制。与 C、Java 等语言不同,Python 没有 switch 语句(直到 Python 3.10 引入了 match...case),也没有括号包裹条件,而是依靠清晰的缩进和优雅的真值测试来构建逻辑。
下面我将从基础语法、核心机制、高级技巧到最佳实践,为你系统梳理 Python 3 的条件控制。
一、 基础语法:if / elif / else
Python 使用冒号 : 和缩进(通常是 4 个空格)来定义代码块。elif 是 else if 的缩写。
score = 85
if score >= 90:
print("优秀")
elif score >= 80:
print("良好") # 这里会被执行
elif score >= 60:
print("及格")
else:
print("不及格")💡 注意:条件判断是从上到下依次进行的,一旦某个条件为 True,执行完对应代码块后,整个 if 结构就会立即结束,不会继续检查后面的 elif 或 else。
二、 Python 的精髓:真值测试 (Truth Value Testing)
在 Python 中,任何对象都可以用于条件判断。Python 会自动将其转换为布尔值(True 或 False)。掌握哪些值是 False,是写出 “Pythonic” 代码的关键。
1. 被视为 False (Falsy) 的值:
- 常量:
False,None - 数字零:
0,0.0,0j(复数零) - 空序列或集合:
""(空字符串),[](空列表),()(空元组),{}(空字典),set()(空集合)
2. 其他所有值均被视为 True (Truthy)。
✅ 最佳实践:直接判断对象本身,而不是判断它的长度或是否等于 None。
my_list = [1, 2, 3]
name = ""
# ❌ 新手写法 (啰嗦)
if len(my_list) > 0:
print("列表不为空")
if name == "":
print("名字为空")
if my_var is not None:
print("变量有值")
# ✅ Pythonic 写法 (简洁、高效)
if my_list:
print("列表不为空")
if not name:
print("名字为空")
if my_var:
print("变量有值")三、 逻辑运算符与短路求值 (Short-Circuit Evaluation)
Python 使用英文单词作为逻辑运算符:and, or, not。它们具有短路特性,这在日常编程中非常有用。
| 运算符 | 含义 | 短路特性 |
|---|---|---|
A and B | 逻辑与 | 如果 A 为 False,则不再计算 B,直接返回 A 的值。 |
A or B | 逻辑或 | 如果 A 为 True,则不再计算 B,直接返回 A 的值。 |
not A | 逻辑非 | 返回 A 的布尔反值。 |
实用技巧:利用 or 提供默认值
# 如果 user_input 为空字符串 (Falsy),则使用默认值 "Guest"
user_input = ""
username = user_input or "Guest"
print(username) # 输出: Guest
# 如果 user_input 有值 (Truthy),则保留原值
user_input = "Alice"
username = user_input or "Guest"
print(username) # 输出: Alice四、 高级条件控制技巧
1. 链式比较 (Chained Comparisons)
Python 允许你将多个比较运算符连写,这在数学上非常直观,且比使用 and 更高效。
x = 5
# ✅ Pythonic 写法
if 1 < x < 10:
print("x 在 1 到 10 之间")
# ❌ 传统写法 (不推荐)
if x > 1 and x < 10:
print("x 在 1 到 10 之间")2. 三元运算符 (条件表达式)
用于在单行内根据条件赋值,语法为:[真值] if [条件] else [假值]。
age = 20
# 传统写法
if age >= 18:
status = "成年"
else:
status = "未成年"
# ✅ 三元运算符写法 (简洁)
status = "成年" if age >= 18 else "未成年"3. match...case 结构模式匹配 (Python 3.10+ 新增)
这是 Python 版的 switch 语句,但功能强大得多,支持结构模式匹配(不仅能匹配值,还能解构数据结构)。
def handle_command(command):
match command.split():
case ["quit"]:
print("退出程序")
case ["load", filename]:
print(f"正在加载文件: {filename}")
case ["save", filename]:
print(f"正在保存文件: {filename}")
case _: # _ 相当于 default,匹配所有其他情况
print("未知命令")
handle_command("load data.txt") # 输出: 正在加载文件: data.txt五、 常见陷阱与避坑指南
陷阱 1:误用 = 和 ==
=是赋值运算符。==是相等性比较运算符。
# ❌ 语法错误 (在 Python 3.8+ 中,if 语句内不允许直接赋值,除非使用海象运算符 :=)
if x = 5:
pass
# ✅ 正确写法
if x == 5:
pass陷阱 2:过度嵌套 (Arrow Anti-Pattern)
深层嵌套的 if 会让代码变成“箭头”形状,极难阅读。
# ❌ 糟糕的嵌套
def process_user(user):
if user:
if user.is_active:
if user.has_permission:
print("允许访问")
else:
print("无权限")
else:
print("账户未激活")
else:
print("用户不存在")
# ✅ 推荐做法:提前返回 (Early Return / Guard Clauses)
def process_user(user):
if not user:
print("用户不存在")
return
if not user.is_active:
print("账户未激活")
return
if not user.has_permission:
print("无权限")
return
print("允许访问") # 核心逻辑放在最外层,无需嵌套陷阱 3:混淆 is 和 ==
==比较的是值是否相等。is比较的是内存地址(即两个变量是否指向同一个对象)。
a = [1, 2, 3]
b = [1, 2, 3]
print(a == b) # True (值相等)
print(a is b) # False (是两个不同的列表对象)
# ✅ 唯一例外:判断是否为 None 时,必须使用 is
if my_var is None:
pass总结
Python 的条件控制哲学是 “简洁”与“可读性”。
- 善用缩进,保持代码整洁。
- 利用 Python 的真值测试特性,写出
if my_list:这样优雅的代码。 - 遇到深层嵌套时,果断使用提前返回 (Early Return) 重构代码。
- 对于简单的条件赋值,大胆使用三元运算符。
你现在是否有一个具体的业务逻辑(比如表单验证、状态机流转)不知道如何用 if 优雅地表达?可以发给我,我帮你用 Pythonic 的方式重写!