【Python】模式匹配 match语句详解(仅在Python 3.10及以上版本中可用)

news2025/3/13 7:17:06

文章目录

  • 模式匹配 match语句(仅在 Python 3.10及以上版本 中可用)
    • 1. 基本语法
    • 2. 基本匹配操作
      • 2.1 匹配常量
      • 2.2 匹配变量
      • 2.3 匹配元组
      • 2.4 匹配列表
      • 2.5 匹配字典
      • 2.6 条件匹配
    • 3. 应用场景

模式匹配 match语句(仅在 Python 3.10及以上版本 中可用)

  • Python 3.10 及以上版本中才引入了 match 语句
  • 用于简化复杂的条件判断和数据解构;类似于其他语言中的 switch-case 语句,但功能更强大,支持 结构化模式匹配 (Structural Pattern Matching)

1. 基本语法

# match subject:
#     case pattern1:
#         #当 subject 匹配 pattern1 时执行的代码
#     case pattern2:
#         #当 subject 匹配 pattern2 时执行的代码
#     ...
#     case _:
#         # 当 subject 不匹配时任何前面的模式时执行的代码

2. 基本匹配操作

2.1 匹配常量

可以匹配 单个值

x = 902

match x:
    case 902:
        print('Happy birthday!')
    case _:
        print('this is not my birthday')

在这里插入图片描述
也可以匹配 多个值 ,多个值之间用 | 分隔:

x = -2
 
match x:
    case 0:
        print('x等于0')
    case 1|2|3|4:
        print('x为正数')
    case -1|-2|-3|-4:
        print('x为负数')
    case _:
        print('shayebushi')

在这里插入图片描述

2.2 匹配变量

point = (0,0)
# point = (1,-1)

match point:
  case (x,y):
      print(f'Coordinates are ({x},{y})')
#如果 point 是一个包含两个元素的元组,会将元组的值分别赋给 x 和 y 变量上并打印坐标

在这里插入图片描述

2.3 匹配元组

# tuple = () # 输出: 空元组
tuple = (1,) # 输出: 单元素元组,元素为 1
# tuple = (1, 2) # 输出: 双元素元组,元素为 1,2
# tuple = (1, 2, 3, 4, 5) # 输出: 多个元素元组,前两个为 1 和 2,剩余 (3, 4,5)

match tuple:
    case ():
        print("空元组")
    case (x,):
        print(f"单元素元组,元素为 {x}")
    case (x, y):
        print(f"双元素元组,元素为 {x}{y}")
    case (x, y, *rest):
        print(f"多个元素元组,前两个为 {x}{y},剩余 {rest}")

在这里插入图片描述

2.4 匹配列表

假设用户输入一个命令,用 args = [‘gcc’,‘hello.c’] 存储,用 match 匹配来解析这个列表

args = ['gcc','hello.c','world.c']
# args = ['clean']
# args = ['gcc']
match args:
  # 如果列表中仅有 'gcc' 字符串,没有指定文件名,报错:
  case ['gcc']:
      print('gcc: missing source file(s).')
  # 出现gcc,且至少指定了一个文件:
  # 列表第一个字符串是 'gcc',第二个字符串赋给变量 files,后面的所有任意个字符串绑定到 *files(表明至少指定一个文件)
  case ['gcc',file1,*files]:
      print('gcc compile:' + file1 + ',' + ','.join(files))
  # 列表仅有 'clean'一个字符串:
  case ['clean']:
      print('clean')
  # 其他所有情况
  case _:
      print('invalid command.')

在这里插入图片描述

2.5 匹配字典

d = {'name':'echo','age':'24'}

match d:
    case {"name": name, "age": age}:
        print(f"用户 {name},年龄 {age}")
    case {"error": code}:
        print(f"错误码: {code}")
    case _:
        print("未知格式")

在这里插入图片描述

2.6 条件匹配

可以在 case 语句中使用 if 来添加额外的条件(守卫条件),只有当模式匹配且守卫条件为 True 时,才会执行相应的代码块

# value = 0
value = 10
# value = -10

match value:
    case x if x < 0:
        print("负数")
    case x if x == 0:
        print("零")
    case x if x > 0:
        print("正数")

在这里插入图片描述

3. 应用场景

  • 处理复杂的条件分支:多个复杂的条件需要判断时
  • 解析数据结构:解析JSON数据、处理复杂的配置文件
  • 状态机实现:根据不同状态和事件进行状态转换的判断

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2300479.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法与数据结构(最小栈)

题目 思路 为了返回栈中的最小元素&#xff0c;我们需要额外维护一个辅助栈 min_stack&#xff0c;它的作用是记录当前栈中的最小值。 min_stack的作用&#xff1a; min_stack的栈顶元素始终是当前栈 st 中的最小值。 每当st中压入一个新元素时&#xff0c;如果这个元素小于等…

openCV中如何实现滤波

图像滤波用于去除噪声和图像平滑&#xff0c;OpenCV 提供了多种滤波器&#xff1a; 1.1. 均值滤波&#xff1a; import cv2# 读取图像 image cv2.imread("example.jpg")# 均值滤波 blurred_image cv2.blur(image, (5, 5)) # (5, 5) 是滤波核的大小 滤波核大小的…

2025 BabitMF 第一期开源有奖活动正式开启 !

为了促进开源社区的交流与成长&#xff0c;字节跳动开源的多媒体处理框架 BabitMF &#xff08;GitHub - BabitMF/bmf: Cross-platform, customizable multimedia/video processing framework. With strong GPU acceleration, heterogeneous design, multi-language support, e…

Docker 安装和配置 Nginx 详细图文教程

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template &#x1f33a; 仓库主页&#xff1a; GitCode︱ Gitee ︱ Github &#x1f496; 欢迎点赞 &#x1f44d; 收藏 ⭐评论 …

链表和list

链表和list ‍ ​ ​ ​ ​ ​ ​ ​ ​ ​ 算法题中的经典操作&#xff1a;用空间代替时间​ ​ ​ ​ 双链表头插顺序&#xff1a; 1.先修改新结点的左右指针 2.然后修改结点y的左指针 3.最后修改哨兵位的右指针 双链表在任意位置&#xff08;p&#xff09;之后插入…

深度学习机器学习:常用激活函数(activation function)详解

目录 Sigmoid Function ReLU&#xff08;Rectified Linear Unit&#xff09; LeakyReLU&#xff08;Leaky Rectified Linear Unit&#xff09; ClippedReLU&#xff08;Clipped Rectified Linear Unit&#xff09; PRelu&#xff08;Parametric ReLU&#xff09; Tanh&am…

AIGC图生视频保姆级教程

一、AI文生图高阶技巧 推荐工具 ▸ MidJourney&#xff08;艺术感最强&#xff09; ▸ DALLE 3&#xff08;与ChatGPT深度联动&#xff09; ▸ Leonardo.ai&#xff08;精细化参数控制&#xff09; 核心策略 提示词架构&#xff1a; [主体描述][环境氛围][镜头语言][风格参数…

下载安装运行测试开源vision-language-action(VLA)模型OpenVLA

1. 安装 项目官网OpenVLA 首先按照官网提示的以下代码&#xff0c;执行创建环境->安装最小依赖->git克隆项目等 # Create and activate conda environment conda create -n openvla python3.10 -y conda activate openvla# Install PyTorch. Below is a sample comma…

【Zookeeper如何实现分布式锁?】

Zookeeper如何实现分布式锁? 一、ZooKeeper分布式锁的实现原理二、ZooKeeper分布式锁的实现流程三、示例代码四、总结一、ZooKeeper分布式锁的实现原理 ZooKeeper是一个开源的分布式协调服务,它提供了一个分布式文件系统的接口,可以用来存储和管理分布式系统的配置信息。 …

【MySQL】环境变量配置

环境变量英文名SystemRoot&#xff0c;直译为“系统总&#xff08;根&#xff09;目录"&#xff0c;主要指明操作系统的重要目录在哪里。那么配置MySQL的环境变量&#xff0c;就是在程序运行时&#xff0c;告诉操作系统你的MySQL目录位置。 复制MySQL安装目录&#xff1a;…

为AI聊天工具添加一个知识系统 之103 详细设计之44 自性三藏 之4 祖传代码 之2

本文要点 要点 前面的所有讨论都是为了给出我的设计项目&#xff08;为使用AI聊天工具的聊天者 开挂一个知识系统&#xff09; 的祖传代码 的完整设计&#xff0c;其中 的“槽”&#xff08;占位符变量&#xff09;的 库元&#xff08;宝性和自性creator -本俱 替换内容标准模…

假面与演员:到底是接口在使用类,还是类在使用接口?编程接口与物理接口的区别又是什么?

前言&#xff1a;本篇文章解释了接口学习过程中的2个常见问题&#xff0c;一个是“为什么是类在使用接口”&#xff0c;另一个一个是“编程接口与物理接口的差异源于所处的抽象层次和交互模式的不同”&#xff0c;旨在揭示编程接口的本质。 Part1.是类在使用接口 当学习接口时…

C# 添加图标

一、前言 为应用程序添加图标是优化用户界面、提升应用辨识度的重要操作。合适的图标能帮助用户快速识别和区分不同应用&#xff0c;增强应用的易用性和专业性。 本指南旨在为你提供详细、易懂的步骤&#xff0c;教你如何为应用程序的窗体添加图标。从图标素材的获取到具体的…

Docker 入门与实战:从安装到容器管理的完整指南

&#x1f680; Docker 入门与实战&#xff1a;从安装到容器管理的完整指南 &#x1f31f; &#x1f4d6; 简介 在现代软件开发中&#xff0c;容器化技术已经成为不可或缺的一部分。而 Docker 作为容器化领域的领头羊&#xff0c;以其轻量级、高效和跨平台的特性&#xff0c;深…

HCIA项目实践---ACL访问控制列表相关知识和配置过程

十 ACL访问控制列表 1 策略的概念 在网络连通之后&#xff0c; 把所有为了追求控制而实现的技术都叫策略 2 访问控制 在路由器流量流入或者流出的接口上&#xff0c;匹配流量&#xff0c;执行相应的动作。&#xff08;流量流入或者流出的接口并不是一个固定的概念而是一个相对的…

细说STM32F407单片机RTC入侵检测和时间戳的原理及使用方法

目录 一、入侵检测的功能 二、示例功能 三、项目设置 1、晶振、DEBUG、CodeGenerator、USART6、KEYLED 2、RTC &#xff08;1&#xff09;设置RTC的模式。 &#xff08;2&#xff09;General、Time、Date\Wake Up分组 &#xff08;3&#xff09;Tamper分组 1&#xff…

搜狗浏览器卸载教程

需求背景 今天发现geek居然无法卸载搜狗浏览器&#xff0c;作为一个老司机&#xff0c;这是不允许的。如果你使用geek或者windows的卸载&#xff0c;或者直接在它的安装包的Uninstall.exe中卸载&#xff0c;他走到100%就一直不动了。那玩意是假的。 卸载教程 结束 -----华丽的…

音视频入门基础:RTP专题(9)——FFmpeg接收RTP流的原理和内部实现

一、引言 由《音视频入门基础&#xff1a;RTP专题&#xff08;2&#xff09;——使用FFmpeg命令生成RTP流》可以知道&#xff0c;推流端通过下面FFmpeg命令可以将一个媒体文件转推RTP&#xff0c;生成RTP流&#xff1a; ffmpeg -re -stream_loop -1 -i input.mp4 -vcodec cop…

STM32 串口转 虚拟串口---实现USB转串口功能

一&#xff0c;USART与UART 区别 USART&#xff08;Universal Synchronous/Asynchronous Receiver/Transmitter&#xff09;通用同步/异步串行接收/发送器 相较于UART&#xff1a;通用异步收发传输器&#xff08;Universal Asynchronous Receiver/Transmitter&#xff09;多了…

【进程与线程】Linux 线程、同步以及互斥

每个用户进程有自己的地址空间。 线程是操作系统与多线程编程的基础知识。 系统为每个用户进程创建一个 task_struct 来描述该进程&#xff1a;该结构体中包含了一个指针指向该进程的虚拟地址空间映射表&#xff1a; 实际上 task_struct 和地址空间映射表一起用来表示一个进程…