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

若有侵权,请联系删除

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1801. 积压订单中的订单总数;1567. 乘积为正数的最长子数组长度;923. 三数之和的多种可能

1801. 积压订单中的订单总数 核心思想:维护一个最小堆sell和一个最大堆buy,然后模拟即可。 1567. 乘积为正数的最长子数组长度 核心思想:动态规划,z表示以当前数字num结尾的乘积为正的最长子数组长度,f表示以当前数字num结尾的乘…

C#循环定时上传数据,失败重传解决方案,数据库标识

有些时候我们需要定时的上传一些数据库的数据,在数据不完整的情况下可能上传失败,上传失败后我们需要定时在重新上传失败的数据,该怎么合理的制定解决方案呢?下面一起看一下: 当然本篇文章只是提供一个思路&#xff0…

postman json复杂数据的模拟

先设置路径 然后可以定义下边数据(Key value) 也可以不定义 看你的情况 [{"mac": "4C-77-66-19-50-65","addressPattern": "98jd","platform": "ios","registrationId": "…

android studio安卓模拟器高德SDK定位网络连接异常

背景 使用了高德SDK创建了一个 project, 下面是运行界面: 点击 "开始定位"按钮, 结果并没有返回定位信息, 而是报错了: 根据错误提示打开这个网址: https://lbs.amap.com/api/android-location-sdk/guide/utilities/errorcode, 并且找到错误码 4 的信息, 显示的是网…

【transformer】自注意力源码解读和复杂度计算

Self-attention A t t e n t i o n ( Q , K , V ) s o f t m a x ( Q K T d k ) V Attention(Q,K,V) softmax(\frac{QK^T}{\sqrt{d_k}})V Attention(Q,K,V)softmax(dk​ ​QKT​)V 其中, Q Q Q为查询向量, K K K和 V V V为键向量和值向量,…

油田钻井平台三维应急仿真系统降低事故发生概率

海上钻井是供海上作业人员进行生产作业或者其他活动使用的仿陆地区域,被称为“流动的国土”,主要由上部平台、下浮体(沉垫浮箱)和中部立柱三部分组成,平台上安装钻井、动力、通讯、导航等设备,以及安全救生和人员生活等设施&#…

OB Cloud 初体验

文章来源:韩锋频道 韩锋 数据库行业资深从业者,著有《SQL 优化最佳实践》、《数据库高效优化》等数据库相关著作。 OceanBase(下文简称OB) 作为国内一款优秀的分布式数据库,这些年来发展很快,在金融、电商…

Java之文件操作与IO

目录 一.认识文件 1.1文件是什么? 1.2文件的组织 1.3文件路径 1.4文件的分类 二.文件操作 2.1File概述 三.文件内容操作--IO 3.1JavaIO的认识 3.2Reader和Writer ⭐Reader类 ⭐Writer类 3.2FileInputStream和FileOutputStream ⭐FileInputStream类 …

继承(个人学习笔记黑马学习)

1、基本语法 #include <iostream> using namespace std; #include <string>//普通实现页面//Java页面 //class Java { //public: // void header() { // cout << "首页、公开课、登录、注册...(公共头部)" << endl; // } // void footer() …

【广州华锐互动】VR全景工厂虚拟导览,虚拟现实技术提升企业数字化信息管理水平

随着工业4.0的到来&#xff0c;VR工厂全景制作成为了越来越多工业企业的选择。传统的工厂管理方式往往存在诸多问题&#xff0c;如信息不对称、安全隐患等。为了解决这些问题&#xff0c;VR工厂全景制作应运而生&#xff0c;它通过结合虚拟现实现实技术和数据采集技术&#xff…

设计模式-迭代器

文章目录 1. 引言1.1 概述1.2 设计模式1.3 迭代器模式的应用场景1.4 迭代器模式的作用 2. 基本概念2.1 迭代器 Iterator2.2 聚合 Aggregate2.3 具体聚合 ConcreteAggregate 3. Java 实现迭代器模式3.1 Java 集合框架3.2 Java 迭代器接口3.3 Java 迭代器模式实现示例 4. 迭代器模…

Android 音频框架 基于android 12

文章目录 前言音频服务audioserver音频数据链路hal 提供什么样的作用 前言 Android 的音频是一个相当复杂的部分。从应用到框架、hal、kernel、最后到硬件&#xff0c;每个部分的知识点都相当的多。而android 这部分代码在版本之间改动很大、其中充斥着各种workaround的处理&a…

介绍GitHub

GitHub 是一个基于互联网的源代码托管平台&#xff0c;可以帮助软件开发者存储和管理源代码&#xff0c;方便团队协作和版本控制。GitHub 的主要功能包括&#xff1a; 代码托管&#xff1a;开发者可以在 GitHub 上创建远程代码仓库&#xff0c;存储和管理他们的源代码。 版本控…

聚观早报|多邻国推出进阶英文课程;电动汽车成本将高于燃油车

【聚观365】9月5日消息 多邻国即将推出进阶英文课程 未来电动汽车成本仍将高于燃油车 戴尔科技2024财年第二季度营收229亿美元 现代汽车电动汽车销量在8月份环比继续下滑 马斯克称将用X数据训练AI 多邻国即将推出进阶英文课程 语言学习平台多邻国宣布&#xff0c;为了满…

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

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

SOME/IP TTL 在各种Entry 中各是什么意思?有什么限制?

1 服务发现 SOME/IP SD 服务发现主要用于 定位服务实例检测服务实例状态是否在运行发布/订阅行为管理SOME/IP SD 也是 SOME/IP 消息,遵循 SOME/IP 消息格式,有固定的 Message ID、Request ID 以及 Message Type 等。并对 SOME/IP Payload 进行了详细的定义。 SOME/IP SD …

STM32CUBEMX_创建时间片轮询架构的软件框架

STM32CUBEMX_创建时间片轮询架构的软件框架 说明&#xff1a; 1、这种架构避免在更新STM32CUBEMX配置后把用户代码清除掉 2、利用这种时间片的架构可以使得代码架构清晰易于维护 创建步骤&#xff1a; 1、使用STM32CUBEMX创建基础工程 2、新建用户代码目录 3、构建基础的代码框…

Unity生命周期函数

1、Awake 当对象&#xff08;自己这个类对象&#xff0c;就是这个脚本&#xff09;被创建时 才会调用该生命周期函数 类似构造函数的存在 我们可以在一个类对象创建时进行一些初始化操作 2、OnEnable 失活激活&#xff08;这个勾&#xff09; 想要当一个对象&#xff08;游戏…

C语言基础知识理论版(很详细)

文章目录 前述一、数据1.1 数据类型1.2 数据第一种数据&#xff1a;常量第二种数据&#xff1a;变量第三种数据&#xff1a;表达式1、算术运算符及算术表达式2、赋值运算符及赋值表达式3、自增、自减运算符4、逗号运算符及其表达式&#xff08;‘顺序求值’表达式&#xff09;5…

光电耦合器市场在预测期内预计将以8.99%的复合年增长率增长!

光耦合器是一种用于传输光信号的电子器件。它具有以下特性&#xff1a; 1. 传输性能&#xff1a;光耦合器能够实现光电转化和信号传输&#xff0c;具有良好的传输性能和抗干扰能力&#xff0c;可以避免外部环境的干扰。 2. 隔离性能&#xff1a;光耦合器能够实现电路之间的隔…