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

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

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

相关文章

Git操作笔记

学git已经好多次了。但是还是会忘记很多的东西&#xff0c;一些常用的操作命令和遇到的bug以后在这边记录汇总下 一.github图片展示 图片挂载&#xff0c;我是创建了一个库专门存图片&#xff0c;然后在github的md中用专用命令展示图片&#xff0c;这样你的md就不会全是文字那…

【C语言】文件操作(中卷)

前言 在文件操作&#xff08;上卷&#xff09;中&#xff0c;讲到的主要都是正式文件操作开始之前的前置知识&#xff0c;而这一卷中&#xff0c;我们将开始正式地操作文件。 在上卷中我们已经说到&#xff0c;stdin stdout stderr是三个C语言程序启动时默认打开的流。这三个流…

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

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

TimeDao-一篇文章了解清楚Subspace项目

1 项目简介 什么是Subspace网络&#xff1f; Subspace是为下一波加密创建者构建的第四代区块链。旨在实现web3规模扩容。 Subspace允许开发者以互联网规模运行 Web3 应用。它提供了一个简单的接口&#xff0c;用于快速部署按需求自动扩展的多链去中心化应用。Subspace由一个…

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

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

HCIP-Datacom-ARST自选题库__EBGP【18道题】

一、单选题 1.在排除EBGP邻居关系故障时&#xff0c;你发现两台直连设备使用Loopback口建立连接&#xff0c;故执行display current-configurationconfiguration bgp查看peer ebgp-max-hop hop-count的配置&#xff0c;下列哪项说法是正确的? hop-count必须大于2 hop-count…

8条黄金准则,解决API安全问题

API&#xff08;应用程序编程接口&#xff09;是现代软件开发中不可或缺的一部分。它们允许不同的应用程序之间共享数据和功能&#xff0c;从而促进了软件系统的整合和互操作性。然而&#xff0c;随着API使用的普及&#xff0c;安全性问题也开始浮出水面。 API安全是指保护API免…

Windows 剪映专业版 v5.9.0 解锁VIP、解除限制功能!

介绍 该脚本具备多项高级功能&#xff0c;包括人像抠图、会员专属模板、超清画质以及素材预设。会员可使用的功能均通过此脚本解锁。 解锁剪映软件会员功能&#xff0c;包括人像抠图、会员模板、超清画质以及素材预设等。 在标准操作流程中&#xff0c;用户首先在电脑端启动…

系统架构设计师【第12章】: 信息系统架构设计理论与实践 (核心总结)

文章目录 12.1 信息系统架构基本概念及发展12.1.1 信息系统架构的概述12.1.2 信息系统架构的发展12.1.3 信息系统架构的定义 12.2 信息系统架构12.2.1 架构风格12.2.2 信息系统架构分类12.2.3 信息系统架构的一般原理12.2.4 信息系统常用4种架构模型12.2.5 企业信息系…

大模型应用:Prompt-Engineering优化原则

1.Prompt-Engineering 随着大模型的出现及应用&#xff0c;出现了一门新兴“技术”&#xff0c;该技术被称为Prompt-Enginerring。Prompt Engineering即提示工程&#xff0c;是指在使用大语言模型时&#xff0c;编写高效、准确的Prompt(提示词)的过程。通过不同的表述、细节和…

【JavaEE 进阶(二)】Spring MVC(下)

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多进阶知识 目录 1.前言2.响应2.1返回静态界面2.2返回数据2.3返回HTML代码 3.综合练习3.1计算器3.2用户登…

ROS简介

ROS概念 学习路线 操作系统 Linux环境下编译执行c文件&#xff08;需安装vim超文本编辑器&#xff09; sudo g MyCoding.cpp -o CodeTest //生成一个名字为CodeTest的可执行文件 sudo ./CodeTest //执行c文件版本问题 ROS Melodic Morenia 和 ROS Noetic Ninjemys 是…

基于Django的博客系统之登录增加忘记密码(八)

需求 描述&#xff1a; 用户忘记密码时&#xff0c;提供一种重置密码的方法&#xff0c;以便重新获得账户访问权限。规划&#xff1a; 创建一个包含邮箱输入字段的表单&#xff0c;用于接收用户的重置密码请求。用户输入注册时使用的邮箱地址&#xff0c;系统发送包含重置密码…

CTF本地靶场搭建——基于阿里云ACR实现动态flag题型的创建

接上文&#xff0c;这篇主要是结合阿里云ACR来实现动态flag题型的创建。 这里顺便也介绍一下阿里云的ACR服务。 阿里云容器镜像服务&#xff08;简称 ACR&#xff09;是面向容器镜像、Helm Chart 等符合 OCI 标准的云原生制品安全托管及高效分发平台。 ACR 支持全球同步加速、…

如何恢复 Android 设备上丢失的照片

由于我们的大量数据和日常生活都存储在一台设备上&#xff0c;因此有时将所有照片本地存储在 Android 智能手机或平板电脑上可能是一种冒险行为。无论是由于意外&#xff08;损坏、无意删除&#xff09;&#xff0c;还是您认识的人翻看您的设备并故意删除了您想要保留的照片&am…

从0开始学统计-什么是回归?

1.什么是回归&#xff1f; 回归&#xff08;Regression&#xff09;是统计学中一种用于探索变量之间关系的分析方法。它主要用于预测一个或多个自变量&#xff08;输入变量&#xff09;与因变量&#xff08;输出变量&#xff09;之间的关系。在回归分析中&#xff0c;我们尝试根…

【Leetcode笔记】40.组合总和II

1. 题目要求 这道题目和39.组合总和不一样的地方在于&#xff1a;数组中含有相同的元素。同样地&#xff0c;结果不能含有重复组合。 拿第一个示例来看&#xff0c; candidates [1, 1, 2, 5, 6, 7, 10]问题在于&#xff1a;第一个path[1(index 0), 2]&#xff0c;绝不能出现…

大语言模型实战——最小化模型评测

1. 引言 现在国内外的主流模型&#xff0c;在新模型发布时都会给出很多评测数据&#xff0c;用以说明当前模型在不同数据集上的测评表现&#xff08;如下面llama3发布的评测数据&#xff09;。 这些评测数据是如何给出来的呢&#xff1f;这篇文章会用一个最小化的流程来还原下…

echarts绘制三维柱状图

echarts ECharts 是一个使用 JavaScript 实现的开源可视化库&#xff0c;主要用于数据的可视化展示。ECharts 支持丰富的图表类型&#xff0c;如折线图、柱状图、饼图、地图、K线图等&#xff0c;可以满足不同类型数据的展示需求。 文档地址&#xff1a;echarts 本次所绘制三…

从零开始实现自己的串口调试助手(3) - 显示底部收发,优化串口打开/关闭

注意: 1. 我们要实现自发自收&#xff0c;要将tx&#xff0c;rx连起来 2.发送的 不能是中文符号&#xff0c;因为这可能导致&#xff0c;读取到的是英文符号 --> 导致接收到的size 和发送的size 大小不一致 3.注意同时定义两个槽函数的时候两个槽函数都会被调用&#xff0c;…