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.mzph.cn/news/69010.shtml

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

相关文章

java八股文面试[JVM]——JVM性能优化

JVM性能优化指南 JVM常用命令 jps 查看java进程 The jps command lists the instrumented Java HotSpot VMs on the target system. The command is limited to reporting information on JVMs for which it has the access permissions. jinfo (1)实时…

AIGC专栏3——Stable Diffusion结构解析-以图像生成图像(图生图,img2img)为例

AIGC专栏3——Stable Diffusion结构解析-以图像生成图像(图生图,img2img)为例 学习前言源码下载地址网络构建一、什么是Stable Diffusion(SD)二、Stable Diffusion的组成三、img2img生成流程1、输入图片编码2、文本编码…

SpringCloud(35):Nacos 服务发现快速入门

本小节,我们将演示如何使用Spring Cloud Alibaba Nacos Discovery为Spring cloud 应用程序与 Nacos 的无缝集成。 通过一些原生的spring cloud注解,我们可以快速来实现Spring cloud微服务的服务发现机制,并使用Nacos Server作为服务发现中心,统一管理所有微服务。 1 Spring…

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…

联发科MTK6762/MT6762核心板_安卓主板小尺寸低功耗4G智能模块

MT6762安卓核心板是一款基于MTK平台的高性能智能模块&#xff0c;是一款工业级的产品。该芯片也被称为Helio P22。这款芯片内置了Arm Cortex-A53 CPU&#xff0c;最高可运行于2.0GHz。同时&#xff0c;它还提供灵活的LPDDR3/LPDDR4x内存控制器&#xff0c;此外&#xff0c;Medi…

【FreeRTOS】【应用篇】消息队列【下篇】

前言 本篇文章主要对 FreeRTOS 中消息队列的概念和相关函数进行了详解消息队列【下篇】详细剖析了消息队列中发送、接收时队列消息控制块中各种指针的行为&#xff0c;以及几个发送消息和接收消息的函数的运作流程笔者有关于 【FreeRTOS】【应用篇】消息队列【上篇】——队列基…

【链表OJ 11】复制带随机指针的链表

前言: &#x1f4a5;&#x1f388;个人主页:​​​​​​Dream_Chaser&#xff5e; &#x1f388;&#x1f4a5; ✨✨刷题专栏:http://t.csdn.cn/UlvTc ⛳⛳本篇内容:力扣上链表OJ题目 目录 leetcode138. 复制带随机指针的链表 1. 问题描述 2.代码思路: 2.1拷贝节点插入到…

【文心一言大模型插件制作初体验】制作面试错题本大模型插件

文心一言插件开发初体验 效果图 注意&#xff1a;目前插件仅支持在本地运行&#xff0c;虽然只能自用&#xff0c;但仍然是一个不错的选择。&#xff08;什么&#xff1f;你说没有用&#xff1f;这不可能&#xff01;文心一言app可以支持语音&#xff0c;网页端结合手机端就可…

计算机网络第三节物理层

一&#xff0c;第二章 物理层&#xff08;数据通信有关&#xff09; 1.物理层引入的目的 屏蔽掉传输介质的多样性&#xff0c;导致数据传输方式的不同&#xff1b;物理层的引入使得高层看到的数据都是统一的0,1构成的比特流 2.物理层如何实现屏蔽 物理层靠定义的不同的通信…

智慧园区用水用电信息管理系统:实现高效节能的现代化园区管理

随着科技的不断发展&#xff0c;各类产业园区在我国经济社会发展中发挥着越来越重要的作用。为了提高园区的运营效率、降低能源消耗、实现绿色可持续发展&#xff0c;智慧园区用水用电信息管理系统应运而生。本文将从系统背景、功能特点、应用优势等方面进行详细介绍。 一、系统…

java八股文面试[数据库]——索引下推

什么是索引下推&#xff1f; 索引下推&#xff08;index condition pushdown &#xff09;简称ICP&#xff0c;在Mysql5.6的版本上推出&#xff0c;用于优化查询。 需求: 查询users表中 "名字第一个字是张&#xff0c;年龄为10岁的所有记录"。 SELECT * FROM users…

element+vue table表格全部数据和已选数据联动

1.组件TableChoose <template><div class"tableChooseBox"><div class"tableRow"><div class"tableCard"><div class"tableHeadTip">全部{{ labelTitle }}</div><slot name"body" …

Jupyter Notebook 好用在哪?

Jupyter Notebook 是一个 Web 应用程序&#xff0c;便于创建和共享文学化程序文档&#xff0c;支持实时代码、数学方程、可视化和 Markdown&#xff0c;其用途包括数据清理和转换、数值模拟、统计建模、机器学习等等。目前&#xff0c;数据挖掘领域中最热门的比赛 Kaggle 里的资…

MySQL用navicat工具对表进行筛选查找

这个操作其实很简单&#xff0c;但是对于没操作的人来说&#xff0c;就是不会呀。所以小编出这一个详细图解&#xff0c;希望能够帮助到大家。话不多说看图。 第一步&#xff1a; 点进一张表&#xff0c;点击筛选。 第二步&#xff1a; 点击添加 第三步&#xff1a; 选择要…

诗诺克科技引领数字资产智能交易革命

在当今全球金融市场中&#xff0c;数字资产的崛起正引发着一场前所未有的变革。随着区块链技术不断演进和数字资产广泛获得认可&#xff0c;智能交易系统正在迅速成为投资者和交易者的首选工具。这一趋势不仅在全球范围内显著&#xff0c;而且为金融领域的未来带来了令人瞩目的…

前端、后端面试集锦

诸位读者&#xff0c;我们在工作的过程中&#xff0c;经常会因跳槽而面试。 你开发能力很强&#xff0c;懂得技术也很多&#xff0c;若加上条理清晰的面试话术&#xff0c;可以让您的面试事半功倍。 个人博客阅读量破170万&#xff0c;为尔倾心打造的 面试专栏-前端、后端面试…

总结开发中一些数据处理方法的封装

摘要&#xff1a; 开发中经常会遇到一些组件需要的特定数据结构&#xff0c;后端不一定会返回你需要的数据结构的&#xff0c;所以还是要前端来处理的&#xff01;这里来总结一下平常开发中遇到的需要处理结构的方法&#xff0c;下次遇到直接拿来用就可以了&#xff01; 目录概…

Docker构建Springboot项目,并发布测试

把SpringBoot项目打包成Docker镜像有两种方案&#xff1a; 全自动化&#xff1a;先打好docker镜像仓库&#xff0c;然后在项目的maven配置中配置好仓库的地址&#xff0c;在项目里配置好Dockerfile文件&#xff0c;这样可以直接在idea中打包好后自动上传到镜像仓库&#xff0c…

抢跑预制菜,双汇发展转守为攻?

懒&#xff0c;懒出新风口&#xff0c;预制菜竟成了年轻人新时代的“田螺神话”&#xff1f; 《2022年中国预制菜产业发展白皮书》数据显示&#xff0c;2022年全国预制菜的市场规模是4196亿元人民币&#xff0c;到2026年可以突破万亿大关。 预制菜的火爆显而易见&#xff0c;…

使用docker容器内的anaconda虚拟环境启动python web项目

1、环境安装 1.1 基础镜像 这里以ubuntu18.04 cuda 11.8为基础镜像&#xff08;主机支持nvidia-gpu&#xff09; &#xff08;1&#xff09;拉取ubuntu18.4 cuda11.8镜像 docker pull nvidia/cuda:11.8.0-devel-ubuntu18.04 1.2 docker下anaconda安装 &#xff08;1&am…