跳至内容
Python

Python Switch Case 语句:新手入门指南

探索 Python 的 match-case:涵盖其语法、在数据科学与机器学习中的应用,以及与传统 switch-case 的对比分析。
Matt Crabtree's photo
Matt Crabtree
已更新 · 5分钟 阅读

使用 AI 探索

ChatGPTClaudePerplexity

创建您的免费账户

实践并学习路径你的进步。

使用 Google 继续
继续操作即表示您接受我们的《使用条款》和《隐私政策》,并同意您的数据存储在美国。

探索在 Python 3.10 中引入的 match-case 语句,了解结构化模式匹配如何为 Python 编程带来更优雅且强大的表达能力。我们将深入其语法、在数据科学与机器学习中的应用,并比较它与其他语言中的传统 switch-case 语句。如果您是 Python 新手,务必查看我们的Python 新手速查表。

了解传统的 Switch Case 语句

在 Python 3.10 之前,Python 开发者需要使用多重 if-elif-else 语句或字典来模拟 switch case 的功能。以下是一个使用 if-elif-else 的基本示例:

day = "Saturday"

if day == "Saturday" or day == "Sunday":
    print(f"{day} is a weekend.")
elif day in ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]:
    print(f"{day} is a weekday.")
else:
    print("That's not a valid day of the week.")

# Saturday is a weekend.

在 Python 3.10 中引入的 Match 和 Case

随着 match-case 的引入,Python 现在提供了一项基于结构化模式匹配的特性,使您能够编写更简洁、更强大的条件逻辑。

什么是结构化模式匹配?

结构化模式匹配是在 PEP 634 中引入的一种机制,用于根据数据结构的形状与内容进行匹配和解构。它比传统的值匹配更灵活,支持对序列、映射,甚至自定义类实例进行操作。

Match-Case 的基本语法

下面是一个 match-case 的简单示例。让我们将一周中的日期分类为周末或工作日:

day = "Monday"

# Match the day to predefined patterns
match day:
    case "Saturday" | "Sunday":
        print(f"{day} is a weekend.")  # Match weekends
    case "Monday" | "Tuesday" | "Wednesday" | "Thursday" | "Friday":
        print(f"{day} is a weekday.")  # Match weekdays
    case _:
        print("That's not a valid day of the week.")  # Default case

# Monday is a weekday.

示例中的关键概念:

  1. 使用 case 进行模式匹配:

    • case "Saturday" | "Sunday":匹配列表中的任一模式。| 符号相当于逻辑 OR。

    • case _:兜底(默认)分支,用于处理无效输入。

  2. 无需 break:与传统 switch-case 不同,Python 在首次匹配成功后会退出 match 代码块。

match-case 与 if-elif-else 的对比

在下表中,您可以看到这两种技术的对比:

特性 if-elif-else match-case
引入版本 自早期 Python 版本即已提供 引入于 Python 3.10
语法 使用关键字 if、elif 和 else 使用关键字 match 和 case
可读性 条件较多时可能冗长 在复杂模式下更简洁易读
默认分支 使用 else 作为默认场景 使用 _ 作为默认情况的通配符
模式匹配 仅限于简单条件检查 支持复杂模式匹配(如序列)
性能 对简单条件通常高效 在复杂模式下潜在更高效
作用域 每个代码块通过缩进显式划定 作用域自然而然地由 case 块定义
使用场景 适用于简单的决策任务 理想用于复杂数据结构的解构
灵活性 限于标量比较 可匹配复杂数据类型与结构
自动跳出 某些语言需显式 break 匹配到分支后自动退出

Python 中 Match 和 Case 的高级用法

数据科学应用

在数据科学的数据预处理任务中,Python 的 match-case 语句非常有用。预处理通常涉及依据特定标准将数据分组归类。

例如,在一个动物数据集中,您可能希望按类别(如哺乳动物、鸟类、爬行动物等)进行归类。以下是一个简化示例:

animal = "Eagle"
match animal:
    case "Eagle" | "Parrot":
        print("Bird")
    case "Lion" | "Tiger":
        print("Mammal")
    case "Python" | "Crocodile":
        print("Reptile")
    case _:
        print("Unknown Class")

# Bird

这种方法可以简化复杂的 if-else 逻辑,使代码更易读、更易维护,尤其是在处理包含多种类别的大型数据集时。

Web 开发

在 Django 或 Flask 等 Web 框架中,您可以使用 match-case 来路由 HTTP 请求或处理特定错误码。通过我们的在线课程进一步了解面向开发者的 Python。

示例:路由 HTTP 方法

# Example: Handling HTTP methods in a Flask-like application
method = "POST"

match method:
    case "GET":
        print("Fetching resource...")
    case "POST":
        print("Creating resource...")
    case "PUT":
        print("Updating resource...")
    case "DELETE":
        print("Deleting resource...")
    case _:
        print("Unsupported HTTP method.")

# Creating resource...

说明:

  • method 变量表示 HTTP 请求类型。
  • 每个 case 对应一个可能的 HTTP 方法,简化了否则需要多个 if-elif 的写法。

API 处理

在处理 API 响应时,match-case 可用于处理不同状态码或对 JSON 响应进行分类。

示例:处理状态码

# Example: API response status code handling
status_code = 200

match status_code:
    case 200:
        print("Request succeeded.")
    case 404:
        print("Resource not found.")
    case 500:
        print("Server error. Please try again later.")
    case _:
        print("Unknown status code.")

# Request succeeded.

这种方法让解释与响应 API 结果更加直观。

简单与复杂的模式匹配

Python 的 match-case 不仅限于常量值匹配;它还能处理更复杂的模式。区别如下:

简单的常量匹配

对字符串或整数等简单值进行匹配,能够实现干净、易读的逻辑,上文示例已作说明。

复杂的模式匹配

在处理结构化数据(如字典、序列)时,match-case 可以高效地提取与操作数据。

示例:匹配数据结构

# Example: Categorizing configurations
config = {"type": "database", "name": "PostgreSQL", "version": 13}

match config:
    case {"type": "database", "name": name, "version": version}:
        print(f"Database: {name} (Version {version})")
    case {"type": "cache", "name": name}:
        print(f"Cache system: {name}")
    case _:
        print("Unknown configuration.")

# Database: PostgreSQL (Version 13)

说明:

  • 第一个 case 从字典中提取 name 和 version,便于处理结构化数据。

  • 这展示了 Python 结构化模式匹配的真正威力,远非传统 switch-case 所能企及。

以下是只保留关键信息的精简部分:

超越基础的 Switch-Case

除了基础的值匹配,Python 的 match-case 还包含一些特性,使其区别于其他语言中的传统 switch-case 语句。

守卫子句

守卫是附加在 case 后的 if 条件,只有当该条件也为真时,该 case 才会匹配。这让您能够将模式匹配与额外逻辑结合——这是传统 switch 语句无法做到的:

match point:
    case (x, y) if x == y:
        print(f"Point is on the diagonal at {x}")
    case (x, y) if x > 0 and y > 0:
        print(f"Point {point} is in the first quadrant")
    case (x, y):
        print(f"Point {point} is somewhere else")

# Point (3, 7) is in the first quadrant
 

当仅凭模式不足以区分各分支时,守卫非常有用。

超越 switch-case:解构式模式

尽管上面的示例聚焦于类 switch-case 的用法,但需要了解的是,Python 的 match-case 还可以解构序列、字典和类实例——在匹配的同时捕获其中的值。这远远超出了其他语言中 switch 语句所能提供的能力,也是将结构化模式匹配引入 Python 的主要原因之一。

例如,匹配一个类实例:

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int

point = Point(0, 5)

match point:
    case Point(x=0, y=0):
        print("Origin")
    case Point(x=0, y=y):
        print(f"On the Y-axis at {y}")
    case Point():
        print("Somewhere else on the plane")

# On the Y-axis at 5

如果您想深入探索这些更高级的模式,请查看 PEP 636,这是关于结构化模式匹配的官方教程。

Python Switch Case 的常见陷阱与最佳实践

调试提示

在 Python 中使用 match-case 时,一个常见错误是忘记为默认分支包含下划线(_),相当于传统 if-else 语句中的“else”。如果没有任何特定分支匹配,这可能导致意外行为。务必包含默认分支以处理意外或其他值。

性能考量

尽管 match-case 是一项强大的工具,但在大型应用中对 Python 代码性能的影响仍需考量。在存在大量分支或复杂模式匹配的场景中,性能可能受到影响。在真实环境中对代码进行性能剖析与测试,对于理解与缓解潜在性能问题至关重要。

Python Match-Case 与传统 Switch-Case 的对比

对比分析

Python 的 match-case 与 Java 或 C++ 等语言中的传统 switch-case 存在显著差异。例如,在 Java 中,switch 语句仅限于匹配标量值(如整数与枚举类型),而 Python 的 match-case 则提供了更灵活的模式匹配能力,允许匹配复杂数据类型,如序列和类实例。这使得 Python 的实现更强大,但也需要对模式匹配概念有更深入的理解。

迁移指引

对于熟悉 C++ 或 Java 等语言中传统 switch-case 的程序员而言,迁移到 Python 的 match-case 需要将思维从简单的值匹配转向模式匹配。

需要理解的是,Python 的 match-case 不只是一个 switch-case;它是用于解构数据类型并从复杂结构中提取信息的多功能工具。通过不同数据类型与模式的练习,是掌握其用法的关键。

结语

Python 在 3.10 版本中引入的 match 与 case 语句,已成为现代 Python 的成熟特性。自那以后,结构化模式匹配已经发展为一种可靠工具,并在所有积极维护的语言版本中可用——包括最新的稳定版本 Python 3.14.4(2026 年 4 月),以及 3.13 与 3.12。

您可以在我们的完整教程中阅读更多关于Python 函数的内容,并在我们的中级 Python课程中探索这一概念及其他主题。


Matt Crabtree's photo
Author
Matt Crabtree
LinkedIn

专注于人工智能与教育科技领域的高级编辑,致力于探寻数据与 AI 趋势。  

Python Switch Case 常见问答

如果在 match-case 语句中有两个分支都能匹配同一输入,会发生什么?

Python 会按出现顺序依次评估各个分支。第一个匹配的分支会被执行,且匹配代码块会立即退出。

match-case 能用于自定义类或对象吗?

可以,match-case 可用于自定义类。您可以定义匹配属性的模式,甚至使用守卫来添加额外逻辑。

match-case 比 if-elif-else 更快吗?

性能差异取决于条件的复杂度。对于简单的值检查,两者表现相近。然而,对于复杂的模式匹配,match-case 可能在可读性与效率上更具优势。

什么是 match-case 语句中的守卫(guard)?

守卫是指定在 case 之后、用于进一步限定何时匹配的条件。例如:

match value:
    case x if x > 10:
        print("Value is greater than 10.")

能在 3.10 之前的 Python 版本中使用 match-case 吗?

不可以,match-case 仅在 Python 3.10 及更高版本中可用。对于更早的版本,您可以使用 if-elif-else 或字典映射来实现类似功能。

主题
Python

今天就开始学习 Python

课程

Python 中级

4 小时
1.4M
通过使用 Matplotlib 创建可视化并用 pandas 操作 DataFrame,提升你的数据科学技能。
查看详情开始课程

创建您的免费账户

实践并学习路径你的进步。

使用 Google 继续
继续操作即表示您接受我们的《使用条款》和《隐私政策》,并同意您的数据存储在美国。
查看更多