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.0
    elif 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 6
    elif x==7:return set((7,))
    else:return x

x=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 5
    case 2:
    ^
IndentationError: expected an indented block after 'case' statement on line 4

Process 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 3
    case 1 or 2 or 3 or 4 or 5:
           ^^
SyntaxError: invalid syntax

Process 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,不能匹配

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++20实战之channel

C20实战之channel 继前面两节的直播&#xff0c;讲解了thread、jthread、stop_token、stop_source、stop_callback、cv、cv_any等的用法与底层实现&#xff0c;那么如何基于这些知识实现一个小项目呢&#xff1f; 于是引出了这篇&#xff0c;写一个channel出来。 注&#xff1a…

Python-算法编程100例-双指针(入门级)

1、盛水最多的容器 from typing import Listclass Solution:def maxArea(self, height: List[int]) -> int:# 双指针初始化l 0r len(height) - 1max_area 0# 循环终止条件while l < r:# 指针调整条件if height[l] < height[r]:# 指针调整前计算中间值max_area max…

FreeRTOS基础(四):静态创建任务

上一篇博客&#xff0c;我们讲解了FreeRTOS中如何动态创建任务&#xff0c;那么这一讲&#xff0c;我们从实战出发&#xff0c;规范我们在FreeRTOS下的编码风格&#xff0c;掌握静态创建任务的编码风格&#xff0c;达到实战应用&#xff01; 目录 一、空闲任务和空闲任务钩子…

决定短视频打开率的要素:成都鼎茂宏升文化传媒公司

​ 在当下这个短视频盛行的时代&#xff0c;无论是个人创作者还是企业品牌&#xff0c;都希望通过短视频平台获得更多的曝光和关注。然而&#xff0c;如何让自己的短视频在众多内容中脱颖而出&#xff0c;吸引用户的点击和观看&#xff0c;成为了摆在我们面前的重要问题。成都…

【爬虫工具】油管视频批量采集软件

一、背景介绍 1.1 爬取目标 我用Python独立开发了一款爬虫软件&#xff0c;作用是&#xff1a;通过搜索关键词采集ytb的搜索结果&#xff0c;包含14个关键字段&#xff1a;关键词,页码,视频标题,视频id,视频链接,发布时间,视频时长,频道名称,频道id,频道链接,播放数,点赞数,评…

开源模型应用落地-LangSmith试炼-入门初体验-监控和自动化(五)

一、前言 在许多应用程序中&#xff0c;特别是在大型语言模型(LLM)应用程序中&#xff0c;收集用户反馈以了解应用程序在实际场景中的表现是非常重要的。 LangSmith可以轻松地将用户反馈附加到跟踪数据中。通常最好提供一个简单的机制(如赞成和反对按钮)来收集用户对应用程序响…

工控一体机5寸显示器电容触摸屏(YA05WK)产品规格说明书

如果您对工控一体机有任何疑问或需求&#xff0c;或者对如何集成工控一体机到您的业务感兴趣&#xff0c;可移步控芯捷科技。 一、硬件功能介绍 YA05WK是我公司推出的一款新型安卓屏&#xff0c;4核Cortex-A7 架构&#xff0c;主频1.2GHz的CPU。采用12V供电&#xff0c;标配5寸…

使用QT生成二维码的两种方式

目录 使用QRenCode生成二维码编译生成QRenCode库使用QRenCode结果演示优缺点&#xff1a; 使用QZXing进行二维码的编码和解码编译源码使用QZXing库运行结果优缺点 使用QRenCode生成二维码 编译生成QRenCode库 QRenCode开源库 下载好之后使用cmake-gui打开进行构建生成。 点击…

mathtype7.0产品密钥及2024最新软件激活教程步骤

在数字化教育日益普及的今天&#xff0c;如何有效利用技术工具来提高数学学习的效率和质量&#xff0c;成为了教育工作者和学生共同关注的热点。特别是在处理复杂的数学公式、符号以及方程式时&#xff0c;传统的输入方式往往费时费力&#xff0c;且容易出错。为此&#xff0c;…

如何用python做一个用户登录界面——浔川python社

1 需解决的问题&#xff1a; 1.1如何用python做一个用户登录界面&#xff1f; 1.2需要用到哪些库、模块&#xff1f; 2 问题解决&#xff1a; 2.1 回答 1.1 &#xff1a;合理即可&#xff0c;无标准回答。 2.2 回答 1.2 &#xff1a;tk库&#xff08;缩写&#xff09;、GUL界面…

redis基础学习

redis是一个键值对类型的NoSql类型的数据库。 NoSql&#xff08;Non-relational SQL的缩写&#xff0c;也有人看作是not only sql的缩写&#xff09;型数据库&#xff0c;具有以下特征&#xff1a; 1、非结构化&#xff1a;几乎没有约束&#xff0c;约束很少&#xff0c;这要看…

【LLM】两篇多模态LLM综述MultiModal Large Language Models

note &#xff08;一&#xff09;现有的 MM-LLM 的趋势&#xff1a; (1)从专门强调 MM 理解对特定模态的生成的进展&#xff0c;并进一步演变为任何到任何模态的转换&#xff08;例如&#xff0c;MiniGPT-4 → MiniGPT-5 → NExT-GPT&#xff09;&#xff1b; (2) 从 MM PT 提…

神经网络与深度学习——第7章 网络优化与正则化

本文讨论的内容参考自《神经网络与深度学习》https://nndl.github.io/ 第7章 网络优化与正则化 网络优化与正则化 网络优化 网络结构多样性 高维变量的非凸优化 神经网络优化的改善方法 优化算法 小批量梯度下降 批量大小选择 学习率调整 学习率衰减 学习率预热 周期性学习率调…

装甲车启动电源的安全性能分析

装甲车辆启动电源是一种为装甲车辆提供启动动力的专业设备。它通常被用于 火箭兵 、步兵战车、装甲运兵车等JS车辆&#xff0c;这些车辆通常需要较高的启动功率来启动其发动机&#xff0c;尤其是装甲车的发动机&#xff0c;由于其功率大&#xff0c;启动对电力要求很高。在现代…

3DMAX一键虚线图形插件DashedShape使用方法

3DMAX一键虚线图形插件使用方法 3dMax一键虚线图形插件&#xff0c;允许从场景中拾取的样条线创建虚线形状。该工具使你能够创建完全自定义的填充图案&#xff0c;为线段设置不同的材质ID&#xff0c;并在视口中进行方便的预览。 【版本要求】 3dMax 2012 – 2025&#xff08;…

HarmonyOS应用开发学习历程(1)初识DevEco Studio

1.create project Bundle name&#xff1a;包名&#xff0c;标识应用程序&#xff0c;默认应用ID也使用该名 Compile SDK&#xff1a;编译时API版本 2.工程目录 AppScope&#xff1a;应用全局所需资源 entry&#xff1a;应用的主模块&#xff0c;含代码、资源 hvigor&#…

Java多线程问题

线程 何为线程&#xff1a;线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享进程的堆和方法区资源&#xff0c;但每个线程有自己的程序计数器、虚拟机栈和本地方法栈&#xff0c;所以系统在产生一个线程&#xf…

OSEK错误处理及跟踪调试

1 前言 如表1所示&#xff0c;OSEK提供了一些特殊的钩子例程&#xff08;Hook routines&#xff09;&#xff0c;应用层可以在钩子函数中自定义操作&#xff0c;以参与到操作系统的内部处理中。 表1 钩子函数类型 钩子函数例程功能用途ErrorHook用于错误处理StartupHook在系统启…

【论文复现|智能算法改进】基于多策略麻雀搜索算法的机器人路径规划

目录 1.算法原理2.改进点3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】麻雀搜索算法&#xff08;SSA&#xff09;原理及实现 2.改进点 改进的无限折叠迭代混沌映射 无限折叠迭代映射(ICMIC) 常用于图像加密方向的研究, 基本思想是首先生成[0,1]之间的混沌序列, …

【Qt秘籍】[008]-Qt中的connect函数

在Qt框架中&#xff0c;connect函数是一个非常核心的函数&#xff0c;用于实现信号&#xff08;Signals&#xff09;和槽&#xff08;Slots&#xff09;之间的连接&#xff0c;它是Qt信号槽机制的关键所在。信号槽机制是一种高级的通信方式&#xff0c;允许对象在状态改变时通知…