iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >深入理解最新Python中的Match Case
  • 797
分享到

深入理解最新Python中的Match Case

2024-04-02 19:04:59 797人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

有些人仍然认为 python 不需要“switch-case”语法。 甚至 Guido 本人也不支持在 Python 中添加这种语法。但是,为什么它仍然在这个新版本中发布? 在我看来

有些人仍然认为 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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 深入理解最新Python中的Match Case

本文链接: https://www.lsjlt.com/news/156564.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 深入理解最新Python中的Match Case
    有些人仍然认为 Python 不需要“switch-case”语法。 甚至 Guido 本人也不支持在 Python 中添加这种语法。但是,为什么它仍然在这个新版本中发布? 在我看来...
    99+
    2022-11-12
  • 如何深入理解最新Python中的Match Case
    如何深入理解最新Python中的Match Case,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。有些人仍然认为 Python 不需要“switch-case”语法。 甚至 G...
    99+
    2023-06-25
  • 深入理解 Python 中的多线程 新手必看
    示例1 我们将要请求五个不同的url: 单线程 import time import urllib2 defget_responses(): urls=[ ‘http://www.bai...
    99+
    2022-06-04
    必看 多线程 新手
  • 学习PHP8的新特性,深入理解最新技术的指南
    深入解析PHP8的新特性,助您掌握最新技术随着时间的推移,PHP编程语言一直在不断演进和改进。最近发布的PHP8版本为开发者提供了许多令人兴奋的新特性和改进,为我们的开发工作带来了更多便利和效率。在本文中,我们将深入解析PHP8的新特性,并...
    99+
    2023-12-23
    PHP 新特性 技术掌握
  • 深入理解Python中的__builti
    0.说明        这里的说明主要是以Python 2.7为例,因为在Python 3+中,__builtin__模块被命名为builtins,下面主要是探讨Python 2.x中__builtin__模块和__builtins__模块...
    99+
    2023-01-31
    Python __builti
  • 深入理解python中的ThreadLocal
    ThreadLocal在threading模块中,可以见得它是为我们的线程服务的。 它的主要作用是存储当前线程的变量,各个线程之间的变量名是可以相同的,但是线程之间的变量是隔离的,也...
    99+
    2023-03-08
    python ThreadLocal
  • 深入理解python中的select模块
    简介 Python中的select模块专注于I/O多路复用,提供了select poll epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kq...
    99+
    2022-06-04
    模块 python select
  • 深入理解python中的atexit模块
    atexit 模块介绍 python atexit 模块定义了一个 register 函数,用于在 python 解释器中注册一个退出函数,这个函数在解释器正常终止时自动执行,一般用来做一些资源清理的操作...
    99+
    2022-06-04
    模块 python atexit
  • 深入理解Python中的super()方法
    前言 python的类分别有新式类和经典类,都支持多继承。在类的继承中,如果你想要重写父类的方法而不是覆盖的父类方法,这个时候我们可以使用super()方法来实现 python语言与C++有相似的类继承,在...
    99+
    2022-06-04
    方法 Python super
  • 深入理解Python的元类
    目录什么是元类type元类动态创建类自定义元类总结什么是元类 Python中,一切皆对象,我们定义的数字、字符串、函数、列表等都是对象,对象是类(class)的是实例,而类(clas...
    99+
    2022-11-12
  • 深入理解python中的浅拷贝和深拷贝
    在讲什么是深浅拷贝之前,我们先来看这样一个现象: a = ['scolia', 123, [], ] b = a[:] b[2].append(666) print a print b 为什么我只对...
    99+
    2022-06-04
    和深 python
  • 深入理解Python中的内置常量
    前言 大家都知道Python内置的常量不多,只有6个,分别是True、False、None、NotImplemented、Ellipsis、__debug__。下面就来看看详细的介绍: 一. True ...
    99+
    2022-06-04
    常量 Python
  • 关于对python中self的深入理解
    假设有一个类nameMain(), 如最下面代码 类 : 一个抽象的模板。可以理解为抽象设计图类名:类的名字。查看/实现方式 :print(nameMain)或者print(self...
    99+
    2022-11-11
  • 深入理解Python对Json的解析
    Json简介 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3rd Edition - De...
    99+
    2022-06-04
    Python Json
  • 深入理解Python中__init__.py文件
    目录1. 简介1.1 模块(Module)和包(Package)的概念1.2 __init__.py文件简介2. __init__.py内容写法2.1 __init__.py文件内容...
    99+
    2023-02-09
    Python中__init__.py
  • 深入理解Python虚拟机中的Code obejct
    目录Code Object 数据结构CodeObject 详细分析Flags 字段详细分析freevars & cellvarsstacksize总结在本篇文章当中主要给大家...
    99+
    2023-05-14
    Python虚拟机 Code obejct Python虚拟机 Python Code obejct
  • 深入理解Python中装饰器的用法
    因为函数或类都是对象,它们也能被四处传递。它们又是可变对象,可以被更改。在函数或类对象创建后但绑定到名字前更改之的行为为装饰(decorator)。 “装饰器”后隐藏了两种意思——一是函数起了装饰作用,例如...
    99+
    2022-06-04
    Python
  • 深入理解Python中的*重复运算符
    在python中有个特殊的符号“*”,可以用做数值运算的乘法算子,也是用作对象的重复算子,但在作为重复算子使用时一定要注意 注意的是:*重复出来的各对象具有同一个id,也就是指向在内存中同一块地址,在对各...
    99+
    2022-06-05
    运算符 Python
  • 怎么深入理解Python中的ThreadLocal变量
    怎么深入理解Python中的ThreadLocal变量,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在上篇我们看到了 ThreadLocal ...
    99+
    2022-10-19
  • 深入理解Python中range和xrange的区别
    编程网已经给大家介绍过range和xrange的区别的基础知识,有兴趣的朋友可以参阅: python中xrange和range的区别 python中range()与xrange()用法分析 本次小编给大家...
    99+
    2022-06-04
    区别 Python range
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作