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

Python3 match-case 语句

前言

本文主要介绍match-case语句与switch-case的区别,及match-case语句的基本用法。

文章目录

  • 前言
  • 一、switch-case 和match-case的区别
  • 二、match-case的基本用法
    • 1、可匹配的数据类型
    • 2、多条件匹配
    • 3、通配符匹配

在这里插入图片描述

一、switch-case 和match-case的区别

C语言里面switch-case所匹配的变量类型只能是整数型或者字符型,而Python里的match-case数据类型(对象类型)丰富多彩,可以是整数、浮点数、字符串、元组、列表、字典。
C语言中一个典型的swicht-case语句像下面这样,在switch里包含要判断的变量x,case语句后则是匹配变量值是多少,如果满足这个匹配条件,就执行“case n:”后面的语句,直到遇到break退出swith语句。

#include <stdio.h>int main() {int x;printf("输入数值: ");scanf("%d", &x);switch(x) {case 1:printf("星期一\n");break;case 2:printf("星期二\n");break;case 3:printf("星期三\n");break;case 4:printf("星期四\n");break;case 5:printf("星期五\n");break;case 6:printf("星期六\n");break;case 7:printf("星期天\n");break;default:printf("输入错误\n");break;}return 0;
}

输出结果:

4 星期一

在Python3.10里面类似的功能可以用match-case语句实现:

x = int(input("输入数值: "))
match x:case 1:print('星期一')case 2:print('星期二')case 3:print('星期三')case 4:print('星期四')case 5:print('星期五')case 6:print('星期六') case 7:print('星期天')    case _:print("输入错误")

输出结果:

输入数值: 1   #这里是每次输入只能输出一个结果,为了排版写在了一起
星期一
输入数值: 7
星期天
输入数值: 10
输入错误

match类似C语言的switch关键字,后面跟要匹配的变量;case跟各种不同的条件,其后面是满足某一条件要执行的语句;每个case语句结束时不需要break语句。

最后一个case加下划线表示缺省匹配,如果前面的条件没有匹配上就跑到这个case里面执行,类似于C语言的default,缺省匹配不可以放置在其他case语句前,否则会报SyntaxError错误: wildcard makes remaining patterns unreachable。当然缺省匹配并不是必须的,加一个缺省匹配可以让程序运行的结果更有可读性。

二、match-case的基本用法

1、可匹配的数据类型

1)匹配对象类型为字符串类型
不像C语言里面switch所匹配的变量类型只能是整数型或者字符型,Python里的匹配对象类型可以用字符串类型:

x = input("输入英文简写: ")
match x:case 'mon':print('星期一')case 'tue':print('星期二')case 'wed':print('星期三')case 'thur':print('星期四')case 'fri':print('星期五')case 'sat':print('星期六')case 'sun':print('星期天')case _:print("输入错误")

输出结果:

输入英文简写: sun   #这里是每次输入只能输出一个结果,为了排版写在了一起
星期天
输入英文简写: none
输入错误

2)匹配对象类型为浮点型
如果一定要用浮点型来做匹配那也是可以的,下面这个例子中要匹配的变量x为整型,case后的值为整型或浮点型:

x = int(input("输入数值: "))
match x:case 1:print('星期一')case 2:print('星期二')case 3.0:print('星期三')case 4.0:print('星期四')case 5.0:print('星期五')case 6.0:print('星期六')case 7.0:print('星期天')case _:print("输入错误")

输出结果:

输入数值: 1   #这里是每次输入只能输出一个结果,为了排版写在了一起
星期一
输入数值: 3
星期三
输入数值: 9
输入错误

还可以这样,要匹配的变量x为浮点型,case后的值为整数型或浮点型:

x = float(input("输入数值: "))
match x:case 1:print('星期一')case 2:print('星期二')case 3:print('星期三')case 4:print('星期四')case 5.5:print('星期五')case 6:print('星期六')case 7.0:print('星期天')case _:print("输入错误")

输出结果:

输入数值: 1   #这里是每次输入只能输出一个结果,为了排版写在了一起
星期一
输入数值: 1.0
星期一
输入数值: 5   #要匹配的变量为5.5才是星期五,这里的5匹配到了缺省匹配,所以是输入错误
输入错误
输入数值: 5.5
星期五
输入数值: 7.2
输入错误

从上面的例子可以看出些端倪,match后的变量类型和case后的类型并不一定要相同。
3)概括:匹配类型为可以是整数、浮点数、字符串、元组、列表、字典
下面设计的这个实验就是通过输入不同的数值模拟函数返回不同的数据类型,让match后的变量类型都不一样,在case里如果有一种能匹配上就输出相应的打印:

def func():x = int(input("输入数值: "))if x==1:return 1.0elif x==2:return '2'elif x==3:return (3,0,1)elif x==4:return [4,0,0]elif x==5:return {'5':'k','A':1}elif x==6:return 6elif x==7:return set((7,))else:return xx=func()
print(type(x))
match x:case 1.0:print('星期一')case '2':print('星期二')case (3,0,1):print('星期三')case [4,0,0]:print('星期四')case {'5':'k','A':1}:print('星期五')case 6:print('星期六')case set((7,)):print('星期天')

输出结果:

输入数值: 0   #这里是每次输入只能输出一个结果,为了排版写在了一起
<class 'int'>
输入错误
输入数值: 1
<class 'float'>
星期一
输入数值: 2
<class 'str'>
星期二
输入数值: 3
<class 'tuple'>
星期三
输入数值: 4
<class 'list'>
星期四
输入数值: 5
<class 'dict'>
星期五
输入数值: 6
<class 'int'>
星期六
输入数值: 7
<class 'set'>
输入错误

从上面的例子可以看到,Python里的match-case数据类型(对象类型)丰富多彩,可以是整数、浮点数、字符串、元组、列表、字典,但是对于set类型即使看起来值是一样的,却没有匹配成功。

2、多条件匹配

我们知道在C语言里面如果要匹配多条件,可以将case语句并列书写且其后面不带break语句,比如下面这个例子输入15匹配工作日,输入67匹配周末:我们知道在C语言里面如果要匹配多条件,可以将case语句并列书写且其后面不带break语句,比如下面这个例子输入1~ 5匹配工作日,输入6~ 7匹配周末:

 switch(x){case 1:  case 2:  case 3:case 4:case 5: printf("工作日\n"); break;case 6:  case 7: printf("周末\n"); break;default:printf("输入错误\n"); break;}

当x为1,2,3,4,5中任何一个时都能匹配上printf(“工作日\n”),从而实现多条件的匹配。
我们来看下Python里是不是也可以这么实现多条件的匹配:

x = int(input("输入数值: "))
match x:
case 1:
case 2:
case 3:
case 4:
case 5:print('工作日')
case 6:
case 7:print('周末')
case _:print("输入错误")

输出结果:

  File "D:\pythonCode\main.py", line 5case 2:^
IndentationError: expected an indented block after 'case' statement on line 4Process finished with exit code 1

不好意思,提示IndentationError错误啦,在Python里是不可以这么写的!
Python的match-case语句要用逻辑或符号(|)表示多条件的匹配,case condition1 | condition2 | condition3 |……:

x = int(input("输入数值: "))
match x:case 1 | 2 | 3 | 4 | 5:print('工作日')case 6 | 7:print('周末')case _:print("输入错误")

输出结果:

输入数值: 1   #这里是每次输入只能输出一个结果,为了排版写在了一起
工作日
输入数值: 5
工作日
输入数值: 6
周末
输入数值: 7
周末
输入数值: 8
输入错误

注意不要使用or代替逻辑或符号,否则会提示SyntaxError错误:

  File "D:\pythonCode\main.py", line 3case 1 or 2 or 3 or 4 or 5:^^
SyntaxError: invalid syntaxProcess finished with exit code 1

3、通配符匹配

1)匹配对象为单星号通配符
match-case语句还支持通配符匹配,可以使用类似于match x:case [cond1,cond2,.……,*rem]的通配符匹配,只要列表或者元组的前几个元素的值和顺序满足cond1,cond2,.……,,剩余的元素不管有多少个,都能达到匹配条件,并且rem表示剩余的元素组成的列表。这里的条件不一定像cond1,cond2,……这样有多个,也可以只有一个cond1。下面这个例子输入不同的值返回不同长度的列表,匹配条件为[1,*rem]只要被匹配对象第0个元素为1就能匹配上:

def func():x = int(input("输入数值: "))if x==0: return [0,1]elif x==1: return [1]elif x==2: return [1,2]elif x==3: return [1,2,3]else: return None
x=func()
print('x:',x)
match x:case [1,*rem]:print('rem:',rem)      case _:print("未匹配")

输出结果:

输入数值: 0   #这里是每次输入只能输出一个结果,为了排版写在了一起
x: [0, 1]
未匹配   ###### x的第0个元素为0,不符合匹配条件中第0个元素为1的要求输入数值: 1
x: [1]
rem: []  ###### x的第0个元素为1,满足匹配条件,因为只有1个元素,所以rem为空
输入数值: 2
x: [1, 2]
rem: [2] ###### x的第0个元素为1,满足匹配条件,rem为剩余的元素组成的列表
输入数值: 3
x: [1, 2, 3]
rem: [2, 3]
输入数值: 5
x: None  
未匹配  ###### x值为None,不能匹配

tuple也可以用通配符匹配,我们将上面的例子x改成tuple类型,case匹配对象也是tuple类型,其他的条件不变,可以看到匹配的方式和list类型是一样的,但是需要注意的是如果能匹配上,rem得到的仍然是一个list类型而不是tuple类型:

def func():x = int(input("输入数值: "))if x==0: return (0,1)elif x==1: return (1,)elif x==2: return (1,2)elif x==3: return (1,2,3)else: return None
x=func()
print('x:',x)
match x:case (1,*rem):print(type(rem),'rem:',rem)      case _:print("未匹配")

输出结果:

输入数值: 3   #这里是每次输入只能输出一个结果,为了排版写在了一起
x: (1, 2, 3)
<class 'list'> rem: [2, 3] ###虽然匹配对象为tuple,rem得到的仍然是list
输入数值: 1
x: (1,)
<class 'list'> rem: []

2)匹配对象为双星通配符
双星号通配符可以用于字典的部分键-值匹配,比如下面这个例子中,case匹配的对象只要有一对键-值为 {2: “星期二”} 就能匹配上,并且可以得到rem的值为剩余的键-值。

def func():x = int(input("输入数值: "))if x==0: return {1: "星期一"}elif x==1: return {2: "星期二"}elif x==2: return {1: "星期一", 2: "星期二"}elif x==3: return {1: "星期一", 2: "星期二",3:'星期三'}else: return None
x=func()
print('x:',x)
match x:case {2: "星期二", **rem}:print('rem:',rem)case _:print('未匹配')

输出结果:

输入数值: 0   #这里是每次输入只能输出一个结果,为了排版写在了一起
x: {1: '星期一'}  
未匹配       ######没有包含{2: "星期二"},所以没有匹配上
输入数值: 1
x: {2: '星期二'}
rem: {}     #####能匹配上,且rem为一个空字典{}
输入数值: 2
x: {1: '星期一', 2: '星期二'}
rem: {1: '星期一'}  ##### 去除其中的键-值{2: "星期二"}剩余的键-值{1: '星期一'}赋给了rem
输入数值: 3
x: {1: '星期一', 2: '星期二', 3: '星期三'}
rem: {1: '星期一', 3: '星期三'}
输入数值: 10
x: None   
未匹配  ##### x值为None,不能匹配

相关文章:

Python3 match-case 语句

前言 本文主要介绍match-case语句与switch-case的区别&#xff0c;及match-case语句的基本用法。 文章目录 前言一、switch-case 和match-case的区别二、match-case的基本用法1、可匹配的数据类型2、多条件匹配3、通配符匹配 一、switch-case 和match-case的区别 C语言里面s…...

图论第三天

似乎要团建了&#xff0c;我再猫会。我必须参与上团建再走。 130.被围绕的区域 先把外围的O变成A&#xff0c;再把飞地的O变成X&#xff0c;再把外围A变回O class Solution { public:int neighbor[4][2] {1,0,0,-1,-1,0,0,1};void solve(vector<vector<char>>&a…...

计算机网络学习2

文章目录 信道复用技术 第三章数据链路层概述数据链路层的三个重要问题封装成帧和透明传输差错检测可靠传输的相关基本概念可靠传输的实现机制停止等待协议回退N帧协议选择重传协议 点对点协议PPP共享式以太网网络适配器和MAC地址CSMA_CD协议的基本原理共享式以太网的争用期共享…...

unittest框架

目录 框架&#xff1a; unittest框架: 使用的原因: 核心要素(组成): TestCase测试用例: 可能出现的错误&#xff1a; TestSuite(测试套件): TestRunner(测试执行): 整体步骤: 查看执行结果: TestLoader测试加载: 方法级别Fixture: 类级别Fixture: 模块级别Fixture: 用例脚本…...

Python中的__str__和__repr__:揭示字符串表示的奥秘

标题&#xff1a;Python中的__str__和__repr__&#xff1a;揭示字符串表示的奥秘 摘要 在Python中&#xff0c;对象的字符串表示对于调试和日志记录至关重要。__str__和__repr__是两个特殊的方法&#xff0c;用于定义对象的字符串表示形式。尽管它们在功能上相似&#xff0c;…...

gazebo插入一个图片

在下面的目录下添加文件夹 my_ground_plane 文件夹内容如下 model.sdf <?xml version"1.0" encoding"UTF-8"?> <sdf version"1.4"><model name"my_ground_plane"><static>true</static><link na…...

(已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据

Modals是Bootstrap中用户弹框用的组件,使用时不需要额外引入其他插件,在引入了boostrap.js或者boostrap.min.js前提下就可以使用。 官方的示例: <!-- Button trigger modal --> <button type="button" class="btn btn-primary" data-bs-…...

网络编程介绍(IP)(一)

定义&#xff1a;可以让设备中的程序与网络上其他设备中的程序进行数据交互&#xff08;实现网络通信的&#xff09;。 java.net.*包下提供了网络编程的解决方案。 基本的通信架构&#xff1a; CS架构&#xff08; Client客户端/Server服务端 &#xff09;&#xff1a; Clie…...

C语言 指针——函数指针

目录 什么是函数指针&#xff1f; 函数指针的定义 定义函数指针时的常见错误 函数指针有什么用&#xff1f; 函数指针的主要应用 什么是函数指针&#xff1f; 函数指针 (Function Pointer) 就是指向函数的指针变量 数据类型 ( * 指针变量名 ) ( 形参列表 ); 例如&#x…...

【C++】———list容器

前言 1.list容器简单来说其实就是之前的链表结构。 2.这里的list用的是双向带头结点的循环链表。 目录 前言 一 构造函数 1.1 list (); 1.2 list (size_type n, const value_type& val value_type() ); 1.3 list (InputIterator first, InputIterator last…...

【网络安全技术】——期末复习(冲刺篇)

&#x1f4d6; 前言&#xff1a;快考试了&#xff0c;做篇期末总结&#xff0c;都是重点与必考点。 题型&#xff1a;材料分析题、简答题、看图分析题 课本&#xff1a; 目录 &#x1f552; 1. 计算机网络安全概述&#x1f558; 1.1 安全目标&#x1f558; 1.2 常见的网络安全…...

Python中Web开发-Django框架

大家好&#xff0c;本文将带领大家进入 Django 的世界&#xff0c;探索其强大的功能和灵活的开发模式。我们将从基础概念开始&#xff0c;逐步深入&#xff0c;了解 Django 如何帮助开发人员快速构建现代化的 Web 应用&#xff0c;并探讨一些最佳实践和高级技术。无论是初学者还…...

1882java密室逃脱管理系统 Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java密室逃脱管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助采用了java设计&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用web模式&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&…...

LeetCode 两两交换链表中的节点

原题链接24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff0c;请看图片的过程模拟&#xff0c;这里添加了一个哨兵节点0&#xff0c;目的是为了方便操作&#xff0c;得到指向1节点的指针。 class Solution {public:ListNode* swapPairs(ListNod…...

STM32作业实现(五)温湿度传感器dht11

目录 STM32作业设计 STM32作业实现(一)串口通信 STM32作业实现(二)串口控制led STM32作业实现(三)串口控制有源蜂鸣器 STM32作业实现(四)光敏传感器 STM32作业实现(五)温湿度传感器dht11 STM32作业实现(六)闪存保存数据 STM32作业实现(七)OLED显示数据 STM32作业实现(八)触摸按…...

java mybatis处理大数据量,开启和配置二级缓存,及注意事项,已解决

注意事项&#xff1a; 尽量避免使用下面方式写sql否则会降低服务器性能&#xff1a; mybatis二级缓存开启后&#xff0c;避免使用事务注解&#xff08;加上事务注解后二级缓存数据会导致两次访问不一致问题&#xff09;&#xff1a; 3. 返回的对象实体类&#xff0c;要实现Se…...

在 LLM 架构中应用多专家模型

本文转载自&#xff1a;在 LLM 架构中应用多专家模型 2024年 3月 14日 By Kyle Kranen and Vinh Nguyen https://developer.nvidia.cn/zh-cn/blog/applying-mixture-of-experts-in-llm-architectures/ 文章目录 一、概述二、LLM 架构领域的专家齐聚一堂1、模型容量2、MoE 在降低…...

C语言编程代码软件:深入探索与实战应用

C语言编程代码软件&#xff1a;深入探索与实战应用 在编程的广袤领域中&#xff0c;C语言以其独特的魅力吸引着无数编程爱好者。作为一种基础且强大的编程语言&#xff0c;C语言在软件开发、系统编程、嵌入式系统等领域发挥着不可替代的作用。而要想熟练掌握C语言&#xff0c;…...

【AIGC半月报】AIGC大模型启元:2024.06(上)

AIGC大模型启元&#xff1a;2024.06&#xff08;上&#xff09; (1) ChatTTS&#xff08;语音合成项目&#xff09; (1) ChatTTS&#xff08;语音合成项目&#xff09; 2024.06.01 ChatTTS 文本转语音项目爆火出圈&#xff0c;引来大家极大的关注。短短三天时间&#xff0c;在…...

两款 IntelliJ IDEA 的 AI 编程插件

介绍两款 IntelliJ IDEA 的 AI 编程插件&#xff1a;通义灵码和 CodeGeeX。 通义灵码 这是由阿里推出的一个基于通义大模型的 AI 编码助手。 它提供了代码智能生成、研发智能问答等功能。通义灵码经过海量优秀开源代码数据训练&#xff0c;可以根据当前代码文件及跨文件的上下…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...