Python 中 switch/case 的语法等价物是什么? [复制]

2024-02-11

Programming languages like C/C++, C#, Java, JavaScript and Pascal (Reference https://en.wikipedia.org/wiki/Switch_statement#mw-content-text:%7E:text=used%20in%20programming%20languages%20like%20C%2FC%2B%2B%2C,C%2FC%2B%2B%2C%20C%23%2C%20Visual%20Basic%20.NET%2C%20Java) have a combination of switch and case statements (sometimes also called select or inspect) which allow you to check one value against several conditions to perform certain actions.

my_value = 10;
switch(my_value) {
    case 10:
        print("The number is ten");
    case 2*10:
        print("The number is the double of ten");
    case 100:
        print("The number is one hundred");
    default:
        print("The number is none of 10, 2*10 or 100");
}

Pseudo-Code to depict the special syntax of the switch-case construct.

了解功能等价物,例如字典查找 https://stackoverflow.com/a/11479840/6685358, 是否存在纯粹的句法的相当于上面的编程结构?


TL;DR

As of Python 3.10.0 (alpha6 released https://docs.python.org/3.10/whatsnew/3.10.html2021 年 3 月 30 日),Python 有一个官方语法等效项,称为match https://docs.python.org/3.10/whatsnew/3.10.html#syntax-and-operations:%7E:text=A%20match%20statement%20takes%20an%20expression,as%20one%20or%20more%20case%20blocks..

基本语法是:

match value:
    case condition:
        action(s)
    ...

对于较旧的 Python 版本,如果您不想诉诸,则只有解决方法if-elif-else。 看到这个优秀的社区帖子 https://stackoverflow.com/questions/60208/replacements-for-switch-statement-in-python一些的集合。

Example

my_value = 10
match my_value:
    case 10:
        print("The number is ten")
    case 2*10:
        print("The number is the double of ten")
    case 100:
        print("The number is one hundred")
    case _:
        # this is the default handler if none
        # of the above cases match.
        print("The number is none of 10, 2*10 or 100")

因此,从性能的角度来看,涉及解决方法的其他答案不再有效。

重要告示

如果来自支持的语言switch and case,您可能已经了解他们的行为。但对于 Python,有一些差异需要注意。

  • 案件不会落空

    语言具有以下特征是很常见的switch-case语句执行everycase 值匹配 - 从上到下。于是,就有了第三种说法——break- 用于switch-case如果你不想失败的话可以构造:

    value = 10
    switch (value) {
        case 10:
            print("Value is ten");
        case 2*5:
            print("Value is the double of five");
            break;
        case 20/2:
            print("Value is the half of twenty");
        default:
            print("This is just the default action.");
    }
    

    在这个例子中,第一个two案件将被执行,因为第一个案件失败了。如果没有break第二种情况下的语句,所有情况,包括默认情况,都将被执行。

    在Python中,仅第一个匹配的情况正在被执行。你可以把它想象成每个案例都包含一个隐藏的break陈述。

  • 变量引用不能作为条件

    base_color = "red"
    chosen_color = "green"
    match chosen_color:
        case base_color:
            print("Yes, it matches!")
    

    这段代码实际上打印出颜色匹配!

    作为 case 条件的裸变量引用将始终匹配。

    无论如何,文字就像case "red": ... and 合格的(即点)名称,例如case AllColors.red按预期工作 - 无需害怕他们。

    所有这一切都是如此,因为Python软件基金会并没有决定只是复制另一个无聊的控制流模型,而是实际实现一个成熟的控制流模型模式匹配器这不仅仅是一个switch-case陈述。有关这方面的更多信息可以在下一节中找到。

强大的模式匹配

match - Match ain't case hooey

Specification and information provided in the Python Enhancement Proposals (PEP) nos. 634-636 https://www.python.org/dev/peps/pep-0634/

在Python中,match实际上不仅仅是一个简单的开关 - 因此可能是这个名字。它具有特殊功能,例如深度占位符和通配符。

示例受到阅读文档的启发 - 因此您不必:

match point:
    case (0, 0):
        print("Origin")
    case (0, y):
        print("Our current Y position is", y, " now.")

您可以匹配任意嵌套数据结构,包括占位符。在上面的示例中,我们将一个元组与两个项目进行匹配,在第二种情况下,我们使用占位符y在匹配时获得其值。

您还可以以非常相似的方式匹配类属性:

class Point:
    x: int
    y: int

def location(point):
    match point:
        case Point(x=0, y=0):
            print("Origin is the point's location.")
        case Point(x=0, y=y):
            print("The point lies on the y axis at a height of", y, "units.")

这也解释了为什么在 case 条件下无法匹配单个变量引用:您实际上并不匹配该变量的值,而是实际上引入了同名的占位符! 因此,如果您要打印chosen_color像这样:

base_color = "red"
chosen_color = "green"
match chosen_color:
    case base_color:
        print("Our base color is", base_color)

它实际上会打印出来

我们的基色是绿色

因为base_color现在是一个占位符,它被分配了我们的值chosen_color.

这种高级模式匹配还有很多用例,其中一些有趣的例子在Python 文档 https://docs.python.org/3.10/whatsnew/3.10.html#pep-634-structural-pattern-matching.

Epilogue

Python 3.10 得到应有的采用还需要一段时间。 Python 3.10.0 将于 发布稳定版2021 年 10 月 4 日- 意味着它可能包含在 Ubuntu 22.04 及更高版本中。

如果您只是想自己玩玩并编写程序,将它们部署到您自己的服务器,或者如果您打算以打包形式而不是作为纯源代码文件分发您的作品,请在您的程序中尝试一下这个新功能 -这将是一个好处!

Addendum

尝试Python 3.10.0

对于 Windows 和 macOS 用户,这一页 https://www.python.org/downloads/release/python-3100a6/#content:%7E:text=Files具有官方安装程序下载。

On Debian https://en.wikipedia.org/wiki/Debian和 Ubuntu 一样,您可以使用非常流行的“DeadSnakes”项目 PPA:

sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install python3.10
python3.10 --version

在不破坏系统的情况下尝试 Python 3.10.0

Docker https://en.wikipedia.org/wiki/Docker_(software)是在完全隔离的环境中使用 Python 3.10 的选项,无需任何复杂的设置步骤。

docker run -it python:3.10.0a6-alpine

就是这样。随着时间的推移,可能会发布新的 alpha 或 beta 版本。您将想要更换a6 with a then.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 中 switch/case 的语法等价物是什么? [复制] 的相关文章

  • Matplotlib 标准化颜色条 (Python)

    我正在尝试使用 matplotlib 当然还有 numpy 绘制轮廓图 它有效 它绘制了它应该绘制的内容 但不幸的是我无法设置颜色条范围 问题是我有很多图 并且需要所有图都具有相同的颜色条 相同的最小值和最大值 相同的颜色 我复制并粘贴了在
  • Python 中的六边形自组织映射

    我在寻找六边形 自组织映射 http en wikipedia org wiki Self organizing map在Python上 准备好模块 如果存在的话 绘制六边形单元格的方法 将六边形单元作为数组或其他方式使用的算法 About
  • 使用 Django 的 post_save() 信号

    我有两张桌子 class Advertisement models Model created at models DateTimeField auto now add True author email models EmailField
  • 用 Python 编写一个无操作或虚拟类

    假设我有这样的代码 foo fooFactory create 由于种种原因 fooFactory create 可能无法创建实例Foo 如果可以的话我想要fooFactory create 返回一个虚拟 无操作对象 这个对象应该是完全惰性
  • Dask DataFrame 的逐行处理

    我需要处理一个大文件并更改一些值 我想做这样的事情 for index row in dataFrame iterrows foo doSomeStuffWith row lol doOtherStuffWith row dataFrame
  • Python3 查找 2 个列表中有多少个差异才能相等

    假设我们有 2 个列表 always具有相同的长度和always包含字符串 list1 sot sot ts gg gg gg list2 gg gg gg gg gg sot 我们需要找到 其中有多少项list2应该改变 以便它等于lis
  • Python:随时接受用户输入

    我正在创建一个可以做很多事情的单元 其中之一是计算机器的周期 虽然我将把它转移到梯形逻辑 CoDeSys 但我首先将我的想法放入 Python 中 我将进行计数 只需一个简单的操作 counter 1 print counter 跟踪我处于
  • 行为:如何从另一个文件导入步骤?

    我刚刚开始使用behave http pythonhosted org behave 一个Pythonic BDD框架 使用小黄瓜语法 http docs behat org guides 1 gherkin html 行为需要一个特征 例
  • 字典的嵌套列表

    我正在尝试创建dict通过嵌套list groups Group1 A B Group2 C D L y x 0 for y in x if y x 0 for x in groups d k v for d in L for k v in
  • 使用循环将对象添加到列表(python)

    我正在尝试使用 while 循环将对象添加到列表中 基本上这就是我想做的 class x pass choice raw input pick what you want to do while choice 0 if choice 1 E
  • 在谷歌C​​olab中使用cv2.imshow()

    我正在尝试通过输入视频来对视频进行对象检测 cap cv2 VideoCapture video3 mp4 在处理部分之后 我想使用实时对象检测来显示视频 while True ret image np cap read Expand di
  • 在pycharm中调试python代码

    这个问题类似于this https stackoverflow com questions 10240018 how to use pycharm to debug python script一 我正在尝试调试pyethapp https
  • 是否可以写一个负的python类型注释

    这可能听起来不合理 但现在我需要否定类型注释 我的意思是这样的 an int Not Iterable a string Iterable 这是因为我为一个函数编写了一个重载 而 mypy 不理解我 我的功能看起来像这样 overload
  • 使用 Doc2vec 后如何解释 Clusters 结果?

    我正在使用 doc2vec 将关注者的前 100 条推文转换为矢量表示形式 例如 v1 v100 之后 我使用向量表示来进行 K 均值聚类 model Doc2Vec documents t size 100 alpha 035 windo
  • Plotly:如何避免巨大的 html 文件大小

    我有一个 3D 装箱模型 它使用绘图来绘制输出图 我注意到 绘制了 600 个项目 生成 html 文件需要很长时间 文件大小为 89M 这太疯狂了 我怀疑可能存在一些巨大的重复 或者是由单个项目的 add trace 方法引起的 阴谋 为
  • CSV 在列中查找最大值并附加新数据

    大约两个小时前 我问了一个关于从网站读取和写入数据的问题 从那时起 我花了最后两个小时试图找到一种方法来从输出的 A 列读取最大日期值 将该值与刷新的网站数据进行比较 并将任何新数据附加到 csv 文件而不覆盖旧的或创建重复项 目前 100
  • 从 dask 数据框中的日期时间序列获取年份和星期?

    如果我有一个 Pandas 数据框和一个日期时间类型的列 我可以按如下方式获取年份 df year df date dt year 对于 dask 数据框 这是行不通的 如果我先计算 像这样 df year df date compute
  • 将 Scikit-Learn OneHotEncoder 与 Pandas DataFrame 结合使用

    我正在尝试使用 Scikit Learn 的 OneHotEncoder 将 Pandas DataFrame 中包含字符串的列替换为 one hot 编码的等效项 我的下面的代码不起作用 from sklearn preprocessin
  • 使用“pythonw”(而不是“python”)运行应用程序时找不到模块

    我尝试了这个最小的例子 from flask import Flask app Flask name app route def hello world return Hello World if name main app run deb
  • 从时间序列生成日期特征

    我有一个数据框 其中包含如下列 Date temp data holiday day 01 01 2000 10000 0 1 02 01 2000 0 1 2 03 01 2000 2000 0 3 30 01 2000 200 0 30

随机推荐