Python 之 match 表达式
Python 从 3.10 版本开始增加了 match 语句,和其他语言常见的 switch 语句极其相似,但功能更加强大。
本文通过实例,了解下其用法。
基本的 match 语句
def http_code(status):` `match status:` `case 400 | 404 | 418:` `return "40x request"` `case 200 | 216:` `return "20x request"` `case 500 | 503:` `return "50x request"` `case _:` `return "other codes"`` ``print(http_error(404)) # 40x request
-
不同的选项可以用“或”运算写在一起。
-
匹配了一个 case 后就不会匹配其他 case 了。
-
不同数据类型可以混合使用。
-
_ 匹配剩余的任意情况。
带 if 语句的 case
def check_num(num, guard):` `match num:` `case 1 | 2 | 3 if guard == True:` `print("in case 135")` `case _:` `print("there is something wrong")`` ``check_num(2, False)``check_num(2, True)``check_num(5, True)
如果 if 条件语句不通过,会继续匹配后边的 case。
带as语句的case
go_to = "east"``match go_to:` `case "north" | "south" | "east" | "west" as direction:` `print("go", direction) # go east
使用as语句,在同时多个匹配条件时,可以知道匹配的具体是谁。
匹配枚举类型
from enum import Enum`` `` ``class Color(Enum):` `RED = 'red'` `GREEN = 'green'` `BLUE = 'blue'`` `` ``color = Color('green')`` ``match color:` `case Color.RED:` `print("I see red!")` `case Color.GREEN:` `print("Grass is green")` `case Color.BLUE:` `print("I'm feeling the blues :(")``
匹配序列
point = (0, 8)`` ``match point:` `case (0, 0):` `print("Origin")` `case (0, y):` `print(f"Y={y}") # Y=8` `case (x, 0):` `print(f"X={x}")` `case (x, y):` `print(f"X={x}, Y={y}")` `case _:` `raise ValueError("Not a point")
可以匹配元组 (tuple) 或列表 (list),按顺序逐位匹配,如果对应位置是个变量,就把传入的内容对应位置的值提取出来。
这种情况也可以用if条件句,且被提取出来的变量可以用到条件中。
序列的通配符提取
point = (0, 1, 8, 8, 8, 8)``match point:` `case (0, 0):` `print("0, 0")` `case (0, 1, *numbers):` `print(0, 1, numbers) # 0 1 [8, 8, 8, 8]`` ` `case _:` `print("Error")
匹配了前两位是 0,1,后边的会提取到 numbers 列表变量。
匹配字典
point = {"x":2, "y":4 , "z":9}`` ``match point:` `case {"x":2,"y":y}:` `print(f"Y={y}") # Y=4` `case _:` `print("Something else")
和列表一样,按 key 名称,部分匹配,部分提取。同时可以看到被匹配的变量可以多出内容,match 只关心它需要的。
字典的通配符提取
my_nu = {"x": 1, "y": 2, "z": 3, "o": 4}``match my_nu:` `case {"x": 1, "y": 1}:` `print("x:1, y:1")` `case {"x": 1, "y": 2, **nums}:` `print("x:1, y:2", nums)
nums变量是个字典,匹配了x,y后,其他所有键值对都会放入nums中。
同时可以指定匹配的数据类型:
actions = [` `{"text": "Any class is a valid match target", "color": "green"},` `{"text": "Any class is a valid match target", "color": 7},`` ``]``for action in actions:` `match action:` `case {"text": str(message), "color": str() as c}:` `print("message:", message, "color:", c)` `case _:` `print("Unsupported action")
有两种格式可以选择:str(message) 和 str() as c
匹配类
class Point:` `__match_args__ = ('x', 'y')` `def __init__(self, x, y):` `self.x = x` `self.y = y`` ``def where_is(point):` `match point:` `case Point(0, 0): # Point(x=0, y=0):` `print("Origin")` `case Point(0, y): # Point(x=0, y=y):` `print(f"Y={y}")` `case Point(x, 0): # Point(x=x, y=0):` `print(f"X={x}")` `case Point():` `print("Somewhere else")` `case _:` `print("Not a point")`` ``point = Point(0,9)``where_is(point)
类的匹配也很有意思,如果类内定义了 __match_args__ 成员变量,就可以按其定义的属性顺序按位置参数的形式匹配;如果没有定义这个变量,也可以用关键字参数直接匹配(注释中的形式)。同时也可以做到部分用于匹配,部分用于提取值。
这种匹配我理解的匹配方式是,用 case 后边的关键字名称(直接获得或者从 __match_args__ 中获得)从传入的 point 实例中取得对应的属性进行匹配。
把类嵌入序列进行匹配
class Point:` `__match_args__ = ('x', 'y')`` ` `def __init__(self, x, y):` `self.x = x` `self.y = y`` `` ``points = [Point(0, 9), Point(0, 5)]`` ``match points:` `case []:` `print("No points")` `case [Point(0, 0)]:` `print("The origin")` `case [Point(x, y)]:` `print(f"Single point {x}, {y}")` `case [Point(0, y1), Point(0, y2)]:` `print(f"Two on the Y axis at {y1}, {y2}")` `case _:` `print("Something else")
参考:
https://docs.python.org/3/tutorial/controlflow.html#match-statements
https://peps.python.org/pep-0636/
题外话

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。
👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)
一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。


二、Python必备开发工具
工具都帮大家整理好了,安装就可直接上手!
三、最新Python学习笔记
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

四、Python视频合集
观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

五、实战案例
纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

六、面试宝典


简历模板
👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)
若有侵权,请联系删除
相关文章:
Python 之 match 表达式
Python 从 3.10 版本开始增加了 match 语句,和其他语言常见的 switch 语句极其相似,但功能更加强大。 本文通过实例,了解下其用法。 基本的 match 语句 def http_code(status): match status: case 400 | 404 | 418: …...
.NET Framework 微软官方下载地址
微软官方下载地址: 下载 .NET Framework | 免费官方下载 (microsoft.com) 版本发布日期终止支持.NET Framework 4.8.12022年8月9日.NET Framework 4.82019年4月18日.NET Framework 4.7.22018年4月30日.NET Framework 4.7.12017年10月17日.NET Framework 4.72017年…...
OpenCV(十四):ROI区域截取
在OpenCV中,你可以使用Rect对象或cv::Range来截取图像的感兴趣区域(Region of Interest,ROI)。 方法一:使用Rect对象截取图像 Rect_(_Tp _x, _Tp _y, _Tp _width,_Tp _height) Tp:数据类型&…...
Java学习笔记之----I/O(输入/输出)一
在变量、数组和对象中存储的数据是暂时存在的,程序结束后它们就会丢失。想要永久地存储程序创建的数据,就需要将其保存在磁盘文件中(就是保存在电脑的C盘或D盘中),而只有数据存储起来才可以在其他程序中使用它们。Java的I/O技术可…...
介绍GitHub
GitHub 是一个基于互联网的源代码托管平台,可以帮助软件开发者存储和管理源代码,方便团队协作和版本控制。GitHub 的主要功能包括: 代码托管:开发者可以在 GitHub 上创建远程代码仓库,存储和管理他们的源代码。 版本控…...
js常用的循环遍历
1.while 循环 While语句包括一个循环条件和一段代码块,只要条件为真,就不断循环执行代码块。 while (条件) 语句; // 或者while (条件) 语句;//举例: var i 0; while (i < 100) { console.log(i 当前为: i); i i 1; }2.…...
存量时代的面经
spring-series,感谢这个项目的作者,还有springboot_learn 这个项目 Spring, 说来惭愧,接触spring 已经接近十年了 通过这个项目,我把spring重写的学习了一遍 1,早上先debug 的一个项目的源码是 springboot_security 在这里插入代码片/****: Creating filter chain:org…...
Python入门教程 | Python 流程控制语句
程序流程控制的三种结构 1.顺序结构 计算机执行程序的步骤是从上到下依次执行 2.选择结构(条件控制) Python 条件语句是通过一条或多条语句的执行结果(True 或者 False)来决定执行的代码块。 可以通过下图来简单了解条件…...
力扣:83. 删除排序链表中的重复元素(Python3)
题目: 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 来源:力扣(LeetCode) 链接:力扣(LeetCode)官网 - 全球极客挚…...
iKeyPrime完美解4G信号,可以登录iCloud,有消息通知,支持最新iOS16.6。
iKeyPrime是一款绕过激活锁界面的解锁工具,可以激活所有iPhone苹果手机,二网/三网恢复信号,并且支持插卡接打电话、收发短信、4G流量上网,支持iCloud登录,有消息通知,支持iPhone5S~X的所有型号,…...
micro python 编译流程和方法,以及一部分问题解决
micro python官网 https://micropython.org/ 点击 点击对应的芯片,我这里是ESP32-S3 点击到git 到esp32目录下 按照指引下载安装ESP-IDF IDF版本查看连接如下: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/versions.html 我这里选择…...
AI篇-chatgpt基本用法(文心一言也适用)
目录 (1)基本规则 (2)例子1-文章摘要 (3)例子2-代码生成 (4)文心一言链接 (1)基本规则 相比于搜索引擎,ChatGPT的优势在于其高效的想法关联和…...
Python小知识 - 使用Python进行数据分析
使用Python进行数据分析 数据分析简介 数据分析,又称为信息分析,是指对数据进行综合处理、归纳提炼、概括总结的过程,是数据处理的第一步。 数据分析的目的是了解数据的内在规律,为数据挖掘,并应用于商业决策、科学研究…...
Pytorch.tensor 相关用法
Torch.tensor.backward()方法的使用举例 理解optimizer.zero_grad(), loss.backward(), optimizer.step()的作用及原理 Autograd: 自动求导 import torchatorch.randn(2,2) # tensor默认requires_gradFalse a((a*3)/(a-1)) print(a.requires_grad) print(a.grad_fn) # leaf …...
信维通信投资者关系活动:揭示5G创新实践,展望未来发展
信维通信于近期举办了一场面向投资者的关系活动,旨在揭示公司在5G时代的创新实践和展望未来发展计划。这场活动吸引了众多投资者和证券分析师的关注,他们期待了解信维通信在5G市场的布局和竞争优势。 在活动当天,信维通信的投资者关系部门负…...
AOP进阶-通知顺序
通知顺序 当多个切面的切入点都匹配到目标方法,目标方法运行时,多个通知都会被执行 执行顺序 不同切面类中,默认按照切面类的类名称字母排序 目标方法前的通知方法:字母排名靠前的先执行目标方法后的通知方法:字母排…...
Sui流动性质押黑客松|本周Workshop预告
Sui流动性质押黑客松正在如火如荼的报名中,Sui基金会现诚邀全球开发者前来参与,助力资产再流通。了解黑客松详情:Sui流动性质押黑客松开启报名,赢取千万美金质押和奖励! 黑客松官网:Sui Liquid Staking Ha…...
数学建模:线性与非线性优化算法
🔆 文章首发于我的个人博客:欢迎大佬们来逛逛 数学建模:线性与非线性优化算法 优化算法是指在满足一定条件下,在众多方案中或者参数中最优方案,或者参数值,以使得某个或者多个功能指标达到最优,或使得系统的某些性能指标达到最大值或者最小…...
数学建模--粒子群算法(PSO)的Python实现
目录 1.开篇提示 2.算法流程简介 3.算法核心代码 4.算法效果展示 1.开篇提示 """ 开篇提示: 这篇文章是一篇学习文章,思路和参考来自:https://blog.csdn.net/weixin_42051846/article/details/128673427?utm_mediumdistribute.pc_relevant.none-task-blog-…...
【C++】STL-函数对象-内建函数对象
0.前言 1.算术仿函数 #include <iostream> using namespace std;// STL-内建函数对象-算术仿函数 #include<functional> // 内建函数对象头文件//以下举例两个仿函数 -- negate and plus// negate 一元仿函数 取反仿函数 void test01() {negate<int>n;cout …...
AutoHotkey自动化效率提升指南:从入门到进阶的全场景应用技巧
AutoHotkey自动化效率提升指南:从入门到进阶的全场景应用技巧 【免费下载链接】antimicrox Graphical program used to map keyboard buttons and mouse controls to a gamepad. Useful for playing games with no gamepad support. 项目地址: https://gitcode.co…...
语言的边界,与软件的命运
. GIF文件结构 相比于 WAV 文件的简单粗暴,GIF 的结构要精密得多,因为它天生是为了网络传输而设计的(包含了压缩机制)。 当我们用二进制视角观察 GIF 时,它是由一个个 数据块(Block) 组成的&…...
树莓派4B避坑指南:手把手教你安装兼容的Miniconda 4.9.2(aarch64版)
树莓派4B避坑指南:手把手教你安装兼容的Miniconda 4.9.2(aarch64版) 树莓派4B作为一款高性能的单板计算机,凭借其强大的aarch64架构和丰富的扩展能力,成为众多开发者和爱好者的首选。然而,在安装Miniconda这…...
适合自动化测试练习的免费 API 清单
免费接口-聚合网站 https://www.juhe.cn/ 适合自动化测试练习的免费 API 清单,按场景分类,覆盖 REST/GraphQL、状态码验证、自定义 Mock 与真实数据,可直接用于接口测试(含 Python+pytest)练习。 一、核心免费 API 清单(按场景) 表格 名称 类型 核心用途 特点 访问方式…...
human-pose-estimation.pytorch:简单而强大的人体姿态估计终极指南
human-pose-estimation.pytorch:简单而强大的人体姿态估计终极指南 【免费下载链接】human-pose-estimation.pytorch The project is an official implement of our ECCV2018 paper "Simple Baselines for Human Pose Estimation and Tracking(https://arxiv.o…...
2026年正点原子开发板移植方案——从0开始的Rootfs之路(5)WSL + NFS 网络启动踩坑记:从挂载失败到成功启动的完整历程
2026年正点原子开发板移植方案——从0开始的Rootfs之路(5)WSL NFS 网络启动踩坑记:从挂载失败到成功启动的完整历程项目已经开源!尝试使用IMX-Forge给你的开发板跑新的Linux 7.0内核:https://github.com/Awesome-Embe…...
如何正确计算 CSV 文件中每行学生成绩的平均值
本文详解 python 中使用 csv 模块处理学生成绩数据时常见的累积错误,并提供结构清晰、健壮可靠的解决方案,重点解决因变量作用域不当导致的平均值计算失真问题。在使用 Python 的 csv 模块逐行读取学生成绩文件(如 "students.csv"&…...
避开理论深坑:给开发者的机器学习实用入门指南(附周志华《机器学习》高效阅读路线)
避开理论深坑:给开发者的机器学习实用入门指南 作为一名开发者,你可能已经意识到机器学习正在改变我们解决问题的方式。从推荐系统到图像识别,从自然语言处理到预测分析,机器学习正在成为现代软件开发不可或缺的一部分。但当你翻开…...
5个步骤搞定苹果设备Windows连接:从无法识别到无缝协作
5个步骤搞定苹果设备Windows连接:从无法识别到无缝协作 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: https://gitcode.com/gh_mi…...
城通网盘限速破解:ctfileGet让下载效率提升10倍的技术革命
城通网盘限速破解:ctfileGet让下载效率提升10倍的技术革命 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 在数字化协作日益频繁的今天,网盘已成为信息传递的重要枢纽。然而城通…...
