Python 3 教程

Python3 条件控制

在 Python 3 中,条件控制(Conditionals)是程序做出决策的核心机制。与 C、Java 等语言不同,Python 没有 switch 语句(直到 Python 3.10 引入了 match...case),也没有括号包裹条件,而是依靠清晰的缩进优雅的真值测试来构建逻辑。

下面我将从基础语法核心机制高级技巧最佳实践,为你系统梳理 Python 3 的条件控制。


一、 基础语法:if / elif / else

Python 使用冒号 :缩进(通常是 4 个空格)来定义代码块。elifelse if 的缩写。

纯文本
plaintext
score = 85

if score >= 90:
    print("优秀")
elif score >= 80:
    print("良好")      # 这里会被执行
elif score >= 60:
    print("及格")
else:
    print("不及格")

💡 注意:条件判断是从上到下依次进行的,一旦某个条件为 True,执行完对应代码块后,整个 if 结构就会立即结束,不会继续检查后面的 elifelse


二、 Python 的精髓:真值测试 (Truth Value Testing)

在 Python 中,任何对象都可以用于条件判断。Python 会自动将其转换为布尔值(TrueFalse)。掌握哪些值是 False,是写出 “Pythonic” 代码的关键。

1. 被视为 False (Falsy) 的值:

  • 常量:False, None
  • 数字零:0, 0.0, 0j (复数零)
  • 空序列或集合:"" (空字符串), [] (空列表), () (空元组), {} (空字典), set() (空集合)

2. 其他所有值均被视为 True (Truthy)。

✅ 最佳实践:直接判断对象本身,而不是判断它的长度或是否等于 None。

纯文本
plaintext
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逻辑与如果 AFalse,则不再计算 B,直接返回 A 的值。
A or B逻辑或如果 ATrue,则不再计算 B,直接返回 A 的值。
not A逻辑非返回 A 的布尔反值。

实用技巧:利用 or 提供默认值

纯文本
plaintext
# 如果 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 更高效。

纯文本
plaintext
x = 5

# ✅ Pythonic 写法
if 1 < x < 10:
    print("x 在 1 到 10 之间")

# ❌ 传统写法 (不推荐)
if x > 1 and x < 10:
    print("x 在 1 到 10 之间")

2. 三元运算符 (条件表达式)

用于在单行内根据条件赋值,语法为:[真值] if [条件] else [假值]

纯文本
plaintext
age = 20

# 传统写法
if age >= 18:
    status = "成年"
else:
    status = "未成年"

# ✅ 三元运算符写法 (简洁)
status = "成年" if age >= 18 else "未成年"

3. match...case 结构模式匹配 (Python 3.10+ 新增)

这是 Python 版的 switch 语句,但功能强大得多,支持结构模式匹配(不仅能匹配值,还能解构数据结构)。

纯文本
plaintext
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:误用 ===

  • =赋值运算符。
  • ==相等性比较运算符。
纯文本
plaintext
# ❌ 语法错误 (在 Python 3.8+ 中,if 语句内不允许直接赋值,除非使用海象运算符 :=)
if x = 5: 
    pass

# ✅ 正确写法
if x == 5:
    pass

陷阱 2:过度嵌套 (Arrow Anti-Pattern)

深层嵌套的 if 会让代码变成“箭头”形状,极难阅读。

纯文本
plaintext
# ❌ 糟糕的嵌套
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 比较的是内存地址(即两个变量是否指向同一个对象)。
纯文本
plaintext
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 的条件控制哲学是 “简洁”与“可读性”

  1. 善用缩进,保持代码整洁。
  2. 利用 Python 的真值测试特性,写出 if my_list: 这样优雅的代码。
  3. 遇到深层嵌套时,果断使用提前返回 (Early Return) 重构代码。
  4. 对于简单的条件赋值,大胆使用三元运算符

你现在是否有一个具体的业务逻辑(比如表单验证、状态机流转)不知道如何用 if 优雅地表达?可以发给我,我帮你用 Pythonic 的方式重写!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注