当前位置: 首页 > news >正文

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
  1. 不同的选项可以用“或”运算写在一起。

  2. 匹配了一个 case 后就不会匹配其他 case 了。

  3. 不同数据类型可以混合使用。

  4. _ 匹配剩余的任意情况。

带 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/

---------------------------END---------------------------

题外话

在这里插入图片描述

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。

👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

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

img

五、实战案例

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

img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述

👉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语句包括一个循环条件和一段代码块&#xff0c;只要条件为真&#xff0c;就不断循环执行代码块。 while (条件) 语句; // 或者while (条件) 语句;//举例&#xff1a; var i 0; while (i < 100) { console.log(i 当前为&#xff1a; i); i i 1; }2.…...

存量时代的面经

spring-series,感谢这个项目的作者,还有springboot_learn 这个项目 Spring, 说来惭愧,接触spring 已经接近十年了 通过这个项目,我把spring重写的学习了一遍 1,早上先debug 的一个项目的源码是 springboot_security 在这里插入代码片/****: Creating filter chain:org…...

Python入门教程 | Python 流程控制语句

​ 程序流程控制的三种结构 1.顺序结构 计算机执行程序的步骤是从上到下依次执行 2.选择结构&#xff08;条件控制&#xff09; Python 条件语句是通过一条或多条语句的执行结果&#xff08;True 或者 False&#xff09;来决定执行的代码块。 可以通过下图来简单了解条件…...

力扣:83. 删除排序链表中的重复元素(Python3)

题目&#xff1a; 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚…...

iKeyPrime完美解4G信号,可以登录iCloud,有消息通知,支持最新iOS16.6。

iKeyPrime是一款绕过激活锁界面的解锁工具&#xff0c;可以激活所有iPhone苹果手机&#xff0c;二网/三网恢复信号&#xff0c;并且支持插卡接打电话、收发短信、4G流量上网&#xff0c;支持iCloud登录&#xff0c;有消息通知&#xff0c;支持iPhone5S~X的所有型号&#xff0c;…...

micro python 编译流程和方法,以及一部分问题解决

micro python官网 https://micropython.org/ 点击 点击对应的芯片&#xff0c;我这里是ESP32-S3 点击到git 到esp32目录下 按照指引下载安装ESP-IDF IDF版本查看连接如下&#xff1a; https://docs.espressif.com/projects/esp-idf/en/latest/esp32/versions.html 我这里选择…...

AI篇-chatgpt基本用法(文心一言也适用)

目录 &#xff08;1&#xff09;基本规则 &#xff08;2&#xff09;例子1-文章摘要 &#xff08;3&#xff09;例子2-代码生成 &#xff08;4&#xff09;文心一言链接 &#xff08;1&#xff09;基本规则 相比于搜索引擎&#xff0c;ChatGPT的优势在于其高效的想法关联和…...

Python小知识 - 使用Python进行数据分析

使用Python进行数据分析 数据分析简介 数据分析&#xff0c;又称为信息分析&#xff0c;是指对数据进行综合处理、归纳提炼、概括总结的过程&#xff0c;是数据处理的第一步。 数据分析的目的是了解数据的内在规律&#xff0c;为数据挖掘&#xff0c;并应用于商业决策、科学研究…...

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创新实践,展望未来发展

信维通信于近期举办了一场面向投资者的关系活动&#xff0c;旨在揭示公司在5G时代的创新实践和展望未来发展计划。这场活动吸引了众多投资者和证券分析师的关注&#xff0c;他们期待了解信维通信在5G市场的布局和竞争优势。 在活动当天&#xff0c;信维通信的投资者关系部门负…...

AOP进阶-通知顺序

通知顺序 当多个切面的切入点都匹配到目标方法&#xff0c;目标方法运行时&#xff0c;多个通知都会被执行 执行顺序 不同切面类中&#xff0c;默认按照切面类的类名称字母排序 目标方法前的通知方法&#xff1a;字母排名靠前的先执行目标方法后的通知方法&#xff1a;字母排…...

Sui流动性质押黑客松|本周Workshop预告

Sui流动性质押黑客松正在如火如荼的报名中&#xff0c;Sui基金会现诚邀全球开发者前来参与&#xff0c;助力资产再流通。了解黑客松详情&#xff1a;Sui流动性质押黑客松开启报名&#xff0c;赢取千万美金质押和奖励&#xff01; 黑客松官网&#xff1a;Sui Liquid Staking Ha…...

数学建模:线性与非线性优化算法

&#x1f506; 文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 数学建模&#xff1a;线性与非线性优化算法 优化算法是指在满足一定条件下,在众多方案中或者参数中最优方案,或者参数值,以使得某个或者多个功能指标达到最优,或使得系统的某些性能指标达到最大值或者最小…...

数学建模--粒子群算法(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 …...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

起重机起升机构的安全装置有哪些?

起重机起升机构的安全装置是保障吊装作业安全的关键部件&#xff0c;主要用于防止超载、失控、断绳等危险情况。以下是常见的安全装置及其功能和原理&#xff1a; 一、超载保护装置&#xff08;核心安全装置&#xff09; 1. 起重量限制器 功能&#xff1a;实时监测起升载荷&a…...