深入理解最新Python中的Match Case

有些人仍然认为 Python 不需要“switch-case”语法。 甚至 Guido 本人也不支持在 Python 中添加这种语法。但是,为什么它仍然在这个新版本中发布? 在我看来,原因可以从名称中找到,它被称为“match case”而不是像大多数编程语言那样的“switch case”。

在本文中,我将使用 7 个示例来演示新语法的灵活性和“pythonic”,希望它能帮助你更容易理解它。如果你对 Python 3.10 中的其他功能感兴趣,可以查看之前的文章。喜欢本文点赞支持,欢迎文末加群畅聊。

1. 基础

在任何花哨的东西之前,让我们从这种新语法的基本用例开始。假设我们正在编写一些代码来将 HTTP 状态代码转换为错误消息,我们可以使用 match-case 语法如下:

事实上,对于这个特定的例子,match-case 没有比 if-else 语法带来任何好处,如下所示。

def http_error(status):
    if status == 400:
        return "Bad request"
    elif status == 401:
        return "Unauthorized"
    elif status == 403:
        return "Forbidden"
    elif status == 404:
        return "Not found"
    else:
        return "Unknown status code"

如果它只能做这样的事情,我认为它不会被添加。 让我们继续用更多的例子来看看它可以有多大的灵活性。

2. 默认情况

它的意思是类似于大多数其他语言中的 switch-case 语法,因此它必须具有“默认情况”。 当没有定义的 case 可以匹配时,将执行“default case”中的代码。

Python以其风格实现了这一要求。 它使用代表匿名变量的下划线“_”。 基本原理是匿名变量可以“匹配”任何东西。
让我们看看下面的例子。

在上面的代码中,我们添加了默认情况并显示“其他错误”。

3. 合并案例

如果有时我们有多个案例需要合并怎么办? 换句话说,这些是不同的情况,但我们处理它们的方式应该是相同的。

在 Python 中,我们可以使用管道“|” 将这些案例合并为一个案例。 它也被视为“或”关系。

在上面的代码中,我们将 401 和 403 错误都视为身份验证问题,因此我们可以将它们组合到匹配案例中。

4. 列表中的通配符

更有趣的事情来了。 假设我们正在使用 match-case 语法编写告警逻辑。它接受一个列表作为参数。 第一个元素是时间。 比如有“早上”、“下午”和“晚上”,第二个元素是我们需要做的动作。

但是,我们可能希望告警提醒我们同时做多件事。 因此,我们希望在列表中传递多个动作,以便告警可以提醒我们将所有动作一一执行。
这是实现这种要求的代码。

在这个例子中,我们只有两种情况。 第一种情况不需要过多解释,因为它只是试图匹配单一动作的情况。 在第二种情况下,我们在变量“actions”前面放了一个星号,这样它就可以匹配列表中的一个或多个动作!

5. 子模式

有时,我们可能希望在模式中包含模式。 具体来说,我们希望匹配案例将流分类为特定的“案例”。 但是,在该模式中,我们想要添加更多限制。

还记得我们已经定义了一天中的“时间”必须是“早上”、“下午”或“晚上”吗? 让我们将此限制添加到匹配案例代码中。 如果“时间”与这 3 项中的一项不匹配,则告诉用户该时间无效。

在上面的代码中,它表明我们可以使用一对括号将我们想要匹配的“模式”括起来,并使用管道来分隔这些模式。
如果它不匹配给定的 3 个“时间”之一,则将执行默认情况。

为什么那里有一个问号? 我故意添加它是因为我想强调解决方案。 通常,匹配子模式之一然后引用它完全匹配的模式并不容易。 但是,我们可以在 Python 中拥有这个“参考”。

让我们添加一个“as”关键字,后跟一个变量,这个变量将作为引用。

6. 条件模式

我们需要让这个告警更加“智能”。 到了晚上,让我们显示一些消息来感谢用户完成一天的工作。因此,我们在上面的代码中又添加了一个 case 来只匹配“evening”。

让我们让这个警报更加智能,以鼓励用户“工作与生活平衡”。 因此,当用户晚上想工作或学习时,闹钟会建议用户休息一下。

7. 匹配对象

到目前为止,我们已经探索了很多, 我猜你可能有这样的感觉,它是“match-case”而不是“switch-case”,因为“pattern”永远是关键。

让我们有一个更复杂的例子。 是的,让我们使用 match-case 来匹配一个对象。

我编一个简单的用例。 创建了一个名为“Direction”的类,用于保持水平(东或西)和垂直(北或南)轴上的方向。

class Direction:
    def __init__(self, horizontal=None, vertical=None):
        self.horizontal = horizontal
        self.vertical = vertical

现在,我们要使用 match-case 语法来匹配来自此类的实例并根据属性显示一条消息。

def direction(loc):
    match loc:
        case Direction(horizontal='east', vertical='north'):
            print('You towards northeast')
        case Direction(horizontal='east', vertical='south'):
            print('You towards southeast')
        case Direction(horizontal='west', vertical='north'):
            print('You towards northwest')
        case Direction(horizontal='west', vertical='south'):
            print('You towards southwest')
        case Direction(horizontal=None):
            print(f'You towards {loc.vertical}')
        case Direction(vertical=None):
            print(f'You towards {loc.horizontal}')
        case _:
            print('Invalid Direction')

然后,让我们从类中创建一些对象进行测试。

d1 = Direction('east', 'south')
d2 = Direction(vertical='north')
d3 = Direction('centre', 'centre')

结果表明,match-case 可以根据这些对象的属性轻松匹配这些对象!

总结

在本文中,我介绍了 Python 3.10 中引入的新语法“match-case”,以及它是多么灵活和强大。我相信掌握这种新语法将有助于我们在可读性方面编写更好的代码。

技术交流

欢迎转载、收藏、有所收获点赞支持一下!

到此这篇关于深入理解最新Python中的Match Case的文章就介绍到这了,更多相关Python Match Case内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python正则表达式re.match()匹配多个字符方法的实现

    1.  *表示匹配任意多个字符   \d*表示匹配任意多个数字字符 import re text = "123h1ello world" text1 = "123Hello world456" text2 = "hello world" res = re.match("\d*", text) res1 = re.match("\d*", text1) res2 = re.match("\d*&qu

  • python用match()函数爬数据方法详解

    match()函数的使用.以及从文本中提取数据的方法.在学习re模块的相关函数前应了解正则表达式的特殊字符 准备一个要爬取的文本文档: 直接从某个网页拷贝一份代码,粘贴在 一个txt文件里,以供学习. 方法很简单,比如打开百度视频的热门电影网页,右键点击查看源代码,然后复制,粘贴到一个txt文件里,保存到工作目录下. 有4000多行. re.match(pattern, string, flags=0) ①pattern,是正则表达式.string,被检验的字符串. ②flags是可选参数,此标

  • Python3.9.1中使用match方法详解

    接触编程的朋友都听过正则表达式,在python中叫re模块,属于文字处理服务里面的一个模块.re里面有一个方法叫match,接下来的文章我来详细讲解一下match. 作为新手,我建议多使用帮助文档,也就是help(re),来获取对re的说明.也可以尝试打开模块对应的py文件,细致地了解实现方法. 当然那是后话,饭得一口一口吃. 本文的主角是match,match的作用主要是从字符串起始位置匹配一个模式,如果成功则返回一个对象,失败则为None. 而match的语法是这样:match(patter

  • python re.match()用法相关示例

    学习python爬虫时遇到了一个问题,书上有示例如下: import re line='Cats are smarter than dogs' matchObj=re.match(r'(.*)are(.*?).*',line) if matchObj: print('matchObj.group():',matchObj.group()) print('matchObj.group(1):', matchObj.group(1)) print('matchObj.group(2):', matc

  • 深入理解最新Python中的Match Case

    有些人仍然认为 Python 不需要"switch-case"语法. 甚至 Guido 本人也不支持在 Python 中添加这种语法.但是,为什么它仍然在这个新版本中发布? 在我看来,原因可以从名称中找到,它被称为"match case"而不是像大多数编程语言那样的"switch case". 在本文中,我将使用 7 个示例来演示新语法的灵活性和"pythonic",希望它能帮助你更容易理解它.如果你对 Python 3.10

  • Python中正则表达式match()、search()函数及match()和search()的区别详解

    match()和search()都是python中的正则匹配函数,那这两个函数有何区别呢? match()函数只检测RE是不是在string的开始位置匹配, search()会扫描整个string查找匹配, 也就是说match()只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,match()就返回none 例如: #! /usr/bin/env python # -*- coding=utf-8 -*- import re text = 'pythontab' m = re.ma

  • 浅谈Python中re.match()和re.search()的使用及区别

    1.re.match() re.match()的概念是从头匹配一个符合规则的字符串,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None. 包含的参数如下: pattern: 正则模型 string : 要匹配的字符串 falgs : 匹配模式 match() 方法一旦匹配成功,就是一个match object对象,而match object对象有以下方法: group() 返回被 RE 匹配的字符串 start() 返回匹配开始的位置 end() 返回匹配结束的位置 span()返

  • Python中__init__的用法和理解示例详解

    目录 Python中__init__的用法和理解 补充:Python __init__()类构造方法 Python中__init__的用法和理解 在Python中定义类经常会用到__init__函数(方法),首先需要理解的是,两个下划线开头的函数是声明该属性为私有,不能在类的外部被使用或访问.而__init__函数(方法)支持带参数类的初始化,也可为声明该类的属性(类中的变量).__init__函数(方法)的第一个参数必须为self,后续参数为自己定义. 从文字理解比较困难,通过下面的例子能非常

  • Python中的变量、运算符与流程控制

    目录 一.执行Python程序的两种方式 1.交互式 2.命令行式 二.变量 1.变量的组成 2.变量名的定义规范 3.定义变量的两种方式 4.常量 三.Python变量内存管理 1.引用计数 2.垃圾回收机制 3.小整数池 4.内存地址与数据类型 5.实例: 四.花式赋值 1. 链式赋值 2. 交叉赋值 3.多个变量赋值 五.与用户交互 六.格式化输出 1. 占位符(旧式字符串格式化,逐步淘汰) 2. format格式化 1.格式:<模板字符串>.format(<逗号分隔的参数>

  • Python中super()函数简介及用法分享

    首先看一下super()函数的定义: super([type [,object-or-type]]) Return a **proxy object** that delegates method calls to a **parent or sibling** class of type. 返回一个代理对象, 这个对象负责将方法调用分配给第一个参数的一个父类或者同辈的类去完成. parent or sibling class 如何确定? 第一个参数的__mro__属性决定了搜索的顺序, sup

  • 浅谈python中的@以及@在tensorflow中的作用说明

    虽然用python用了很久了,但是主要还是写一些模型或者算子,对于python中的高级特性用的不多,但是时常阅读大牛的代码或者框架源码,其中python特性应用的非常流畅,所以今天决定与python中的装饰器@,做个了断!! Python中的@: 援引廖雪峰老师对装饰器的解释以及一些自己对装饰器的理解: python中在代码运行期间动态增加功能的方式,称之为"装饰器"(Decorator).@是装饰器的语法.装饰器是在函数调用之上的修饰,这些修饰仅是当声明一个函数或者方法的时候,才会应

  • python 中pass和match使用方法

    前言 ​​pass​​ 语句不执行任何操作.语法上需要一个语句,但程序不实际执行任何动作时,可以使用该语句. 例如: >>> while True: ... pass # Busy-wait for keyboard interrupt (Ctrl+C) ... 下面这段代码创建了一个最小的类: >>> class MyEmptyClass: ... pass ... ​​pass​​​ 还可以用作函数或条件子句的占位符,让开发者聚焦更抽象的层次.此时,程序直接忽略 ​

  • 深入理解Python中的 __new__ 和 __init__及区别介绍

    本文的目的是讨论Python中 __new__ 和 __ini___ 的用法. __new__ 和 __init__ 的区别主要表现在:1. 它自身的区别:2. 及在Python中新式类和老式类的定义. 理解 __new__ 和 __init__ 的区别 这两个方法的主要区别在于:__new__ 负责对象的创建而 __init__ 负责对象的初始化.在对象的实例化过程中,这两个方法会有些细微的差别,表现于:如何工作,何时定义. Python中两种类的定义方式 Python 2.x 中类的定义分为

  • python中super()函数的理解与基本使用

    目录 前言 super的用法 super的原理 Python super()使用注意事项 混用super与显式类调用 不同种类的参数 总结 前言 Python是一门面向对象的语言,定义类时经常要用到继承,在类的继承中,子类继承父类中已经封装好的方法,不需要再次编写,如果子类如果重新定义了父类的某一方法,那么该方法就会覆盖父类的同名方法,但是有时我们希望子类保持父类方法的基础上进行扩展,而不是直接覆盖,就需要先调用父类的方法,然后再进行功能的扩展,这时就可以通过super来实现对父类方法的调用.

随机推荐