Python 之 match 表达式

news2024/10/7 16:19:36

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学习资料》免费赠送🆓!(安全链接,放心点击)

若有侵权,请联系删除

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

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

相关文章

STL ---- vector 使用

单纯的使用vector不和algorithm连用. vector自带的方法: push_back(num) pop_back() push_back 添加元素, pop_back删除元素.添加和删除都是在末尾添加和删除的. void assign(const_iterator first,const_iterator last); // 相当于拷贝函数 void assign(size_type n,const…

长胜证券:创业板上市容易吗?

创业板是我国股市的一个板块,特点是适合一些新式企业在股市进行融资。与A股比较,创业板上市门槛相对较低,整个上市过程相对简单和方便,似乎对于草创企业来说十分有利。但是,实际上,创业板上市虽然相对简单&…

陶氏公司将出席2023第二届中国汽车碳中和峰会

2023第二届中国汽车碳中和峰会将于10月19日-20日在上海举办。 本次峰会将为行业领导者、政策制定者和专家提供一个平台,讨论汽车行业减少碳排放的策略。专家们将从政策、供应链、ESG、替代能源解决方案、汽车材料创新、法律等不同领域分享碳中和与可持续策略。 通…

HDFS HA 高可用集群搭建详细图文教程

目录 一、高可用(HA)的背景知识 1.1 单点故障 1.2 如何解决单点故障 1.2.1 主备集群 1.2.2 Active、Standby 1.2.3 高可用 1.2.4 集群可用性评判标准(x 个 9) 1.3 HA 系统设计核心问题 1.3.1 脑裂问题 1.3.2 数据状…

项目(智慧教室)第三部分,人机交互在stm32上的实现

一。使用软件 1.stm32cubemx中针对汉字提供的软件 2.对数据进行处理 2.上面点击ok--》这里选择确定 3.这里选择保存即可由字符库,但是需要占用内存太大,需35M,但是stm32只有几百k,所以需要自己删减。 生成中文字符(用…

UML基础

统一建模语言(UML是 Unified Modeling Language的缩写, 是用来对软件系统进行可视化建模的一种语言。UML为面向对象开发系统的产品 进行说明、可视化、和编制文档的一种标准语言。 共有9种图 UML中的图其实不止九种 (相同的图还可能会有不同的名称), 这里的九种图是…

写字楼远程预付费抄表系统

写字楼远程预付费抄表系统是一种现代化的智能抄表解决方案,具有许多优点,例如:提高抄表效率,降低人力成本,减少误差,防止偷漏电等问题。下面就由小编来为大家来讲解下写字楼远程预付费抄表系统吧&#xff0…

2023年动力电池回收行业研究报告

第一章 行业概况 1.1 定义 动力电池,通常指用于驱动电动车辆(包括电动汽车、电动自行车、电动滑板车等)的电池。这类电池需要具备高能量密度(以便在较小的空间和重量下提供更多的能量)、高功率密度(以便在…

vue3中TCplayer应用

环境win10:vitevue3elementUI 1 安装 npm install tcplayer.js2 使用 <template><div><video id"player-container-id" width"414" height"270" preload"auto" playsinline webkit-playsinline></video>&l…

01-数据类型和转换

数据 定义&#xff1a;对现实生活中事物的抽象描述&#xff0c;在程序世界中一切都采用数据进行描述&#xff0c;程序的执行实际上就是对数据的操作。数据是存储在内存和硬盘中的。 数据类型 基本数据类型&#xff1a; 数字&#xff08;number)、字符串&#xff08;string&…

基于AI识别与视频监控技术的土地建设履约全周期监管方案

一、项目背景 当前&#xff0c;各级政府正在积极大力推进土地节约集约利用工作&#xff0c;不断推动工业用地提质增效。但是&#xff0c;持续推进土地节约集约利用也面临着一些新情况、新问题&#xff0c;比如&#xff0c;在工业用地批后监管机制还不够健全&#xff0c;存在项…

无涯教程-JavaScript - DVARP函数

描述 DVARP函数通过使用列表或数据库中符合您指定条件的记录的字段(列)中的数字,基于整个总体计算总体的方差。 语法 DVARP (database, field, criteria)争论 Argument描述Required/Optionaldatabase 组成列表或数据库的单元格范围。 数据库是相关数据的列表,其中相关信息的…

2023-09-04 Linux 让shell编译脚本里面设置的环境变量改变kernel里面驱动文件的宏定义值方法,我这里用来做修改固件版本

一、原生的读取版本接口是/proc/version&#xff0c;我这里需要提供获取固件版本号的api给app&#xff0c;因为版本号会经常需要修改&#xff0c;如果每次都到kernel下修改比较麻烦&#xff0c;我这里是想在编译脚本里面对版本号进行修改&#xff0c;这样方便一点。 二、主要修…

实验三十二、OCL电路的研究

一、题目 仿真电路如图1所示。利用 Multisim 研究下列问题&#xff1a; &#xff08;1&#xff09;负载 R 6 R_6 R6​ 上能获得的最大输出功率&#xff1b; &#xff08;2&#xff09;电容 C 1 C_1 C1​、 C 2 C_2 C2​ 的作用&#xff1b; &#xff08;3&#xff09;当输入…

基于ebpf的性能工具-bpftrace实战(内存泄漏)

在之前的篇章中&#xff0c;我们已经详细阐述了bpftrace的操作原理&#xff0c;以及其脚本语法的特点。在本文中&#xff0c;我们将通过实际案例展示bpftrace这一强大工具的实际应用&#xff0c;以便更加深入地理解其在解决问题中的价值。 基于ubuntu22.04-深入浅出 eBPF 基于e…

Python测试框架 Pytest —— mock使用(pytest-mock)

pytest-mock 安装&#xff1a;pip install pytest-mock 这里的mock和unittest的mock基本上都是一样的&#xff0c;唯一的区别在于pytest.mock需要导入mock对象的详细路径。 # weateher_r.py class Mock_weather():def weather(self):天气接口passdef weather_result(self):模…

内网穿透:FRP(Forwarding Remote Proxy)反向代理

frp 是一个可用于内网穿透的高性能的反向代理应用&#xff0c;支持 tcp, udp 协议&#xff0c;为 http 和 https 应用协议提供了额外的能力&#xff0c;且尝试性支持了点对点穿透 下载地址 https://github.com/fatedier/frp/releases 选择最新的就行&#xff0c;linux和windo…

TCP机制之连接管理(三次握手和四次挥手详解)

TCP的连接管理机制描述了连接如何创建以及如何断开! 建立连接(三次握手) 三次握手的过程 所谓建立连接就是通信双方各自要记录对方的信息,彼此之间要相互认同;这里以A B双方确立男女朋友关系为例: 从图中可以看出,通信双方各自向对方发起一个"建立连接"的请求,同时…

Spring Security 安全框架NOTE

目录 1、什么是 Spring Security 安全框架? 2、关于 SpringSecurity 中的认证 3、关于 SpringSecurity 中的授权 3.1 从数据库中查询用户的权限信息 4、关于自定义失败处理 5、跨域问题 前提引入&#xff1a; 随着科技的完善&#xff0c;现在几乎所有的网站以及软件都需…

为大模型添加记忆体,GBASE南大通用驶入向量赛道

大数据产业创新服务媒体 ——聚焦数据 改变商业 理解、生成、逻辑、记忆是人工智能的四大核心能力。 一段人类的日常对话通常可以分解为引子、记忆、分析三个部分。计算机自然语言处理的解法&#xff0c;AI科学家归纳出一个CPV结构&#xff1a;以ChatGPT为代表的大模型承担“分…