Python 模式匹配match case

Python模式匹配语句 match

核心概念

当程序需要针对一个变量的多种可能值进行判断时,传统的 if ... elif ... elif ... else 结构会变得冗长且可读性较差。Python 3.10 引入了 match 语句(也称为模式匹配),它提供了一种更简洁、更直观的方式来处理多分支条件判断。

1. 基本 match 语句

  • 功能 :将一个目标(如变量)与一系列模式(case)进行比较,并执行第一个匹配成功的分支。

  • 与传统if对比

    • if 写法 (冗长):

      python 复制代码
      score = 'B'
      if score == 'A':
          print('score is A.')
      elif score == 'B':
          print('score is B.')
      elif score == 'C':
          print('score is C.')
      else:
          print('invalid score.')
    • match 写法 (清晰):

      python 复制代码
      score = 'B'
      match score:
          case 'A':
              print('score is A.')
          case 'B':
              print('score is B.')
          case 'C':
              print('score is C.')
          case _: # `_` 是通配符,匹配任何值
              print('invalid score.')
  • 关键点- case _: 必须放在最后,用于捕获所有未被前面 case 匹配的情况,类似于 else

    • 语法结构更加规整,意图更明确。

2. 复杂匹配模式

match 的强大之处在于其灵活的匹配模式,远不止简单的相等判断。

  • 带守卫条件的匹配 :使用 ifcase 内进行额外条件检查。
  • 多值匹配 :使用 | (或)来匹配多个值。
  • 值绑定:在匹配的同时,将匹配到的值捕获到变量中。

示例

python 复制代码
age = 15

match age:
    case x if x < 10:         # 匹配所有小于10的值,并将其绑定到变量x
        print(f'< 10 years old: {x}')
    case 10:                  # 精确匹配单个值
        print('10 years old.')
    case 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18: # 匹配多个值
        print('11~18 years old.')
    case 19:
        print('19 years old.')
    case _:
        print('not sure.')

3. 高级应用:匹配列表(解包匹配)

match 语句可以匹配复杂的数据结构,如列表,并能进行解包操作,这使其功能非常强大。

示例:解析命令行参数

python 复制代码
args = ['gcc', 'hello.c', 'world.c'] # 模拟用户输入的命令

match args:
    # 模式1: 列表只包含一个元素'gcc'
    case ['gcc']:
        print('gcc: missing source file(s).')

    # 模式2: 列表第一个元素是'gcc',第二个是任意值(绑定到file1),后面是0个或多个值(绑定到files)
    case ['gcc', file1, *files]:
        print(f'gcc compile: {file1}, {", ".join(files)}')

    # 模式3: 列表只包含一个元素'clean'
    case ['clean']:
        print('clean')

    # 默认情况
    case _:
        print('invalid command.')
  • *files :这是一个通配符 ,它可以捕获列表中的零个或多个剩余元素。这使得匹配可变长度的列表变得非常简单。
  • 工作原理match 会按顺序尝试匹配每个 case 的模式。例如,对于 ['gcc', 'hello.c', 'world.c'],它会匹配第二个模式,并赋值 file1 = 'hello.c'files = ['world.c']

总结要点

  1. 为什么使用 match :替代冗长的 if-elif-else 链,极大地提高代码的可读性和简洁性,尤其是在处理多个枚举值或复杂数据结构时。
  2. 基本语法 :使用 match TARGET: 和一系列 case PATTERN: 进行匹配。
  3. 强大功能
    • 精确匹配case 'A':
    • 或匹配case 11 | 12 | 13:
    • 守卫条件case x if x < 10:
    • 通配符case _: (匹配任何值)
    • 解包匹配case ['cmd', arg1, *args]: (匹配并提取列表内容)
  4. 适用场景:处理状态码、命令解析、处理JSON或嵌套数据等任何需要多分支判断的场景。

match 语句是Python现代化的重要特性,掌握它可以让你的代码更加优雅和Pythonic。

将之前的练习题 重新写一写

python 复制代码
hight = 1.50
weight = 50.5
bmi = weight / hight ** 2
print("bmi=", bmi)

match bmi:
    case _ if bmi < 18.5:
        print("过轻")
    case _ if 18.5 <= bmi < 25:
        print("正常")
    case _ if 25 <= bmi < 28:
        print("过重")
    case _ if 28 <= bmi < 32:
        print('肥胖')
    case _:
        print("严重肥胖")

相关推荐
恋猫de小郭1 小时前
Flutter Zero 是什么?它的出现有什么意义?为什么你需要了解下?
android·前端·flutter
牛奔2 小时前
Go 如何避免频繁抢占?
开发语言·后端·golang
寻星探路6 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
想用offer打牌7 小时前
MCP (Model Context Protocol) 技术理解 - 第二篇
后端·aigc·mcp
崔庆才丨静觅7 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60618 小时前
完成前端时间处理的另一块版图
前端·github·web components
KYGALYX8 小时前
服务异步通信
开发语言·后端·微服务·ruby
掘了8 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅8 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
ValhallaCoder8 小时前
hot100-二叉树I
数据结构·python·算法·二叉树