当前位置: 首页 > 知识库问答 >
问题:

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

云文栋
2023-03-14

像C/C、C#、Java、JavaScript和Pascal(参考)这样的编程语言结合了switchcase语句(有时也称为selectinspect),允许您根据多个条件检查一个值以执行某些操作。

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");
}

伪代码,用于描述开关-大小写构造的特殊语法

了解字典查找等功能等价物后,是否存在与上述编程构造完全相同的语法等价物?

共有2个答案

尉迟明贤
2023-03-14

没有。根据代码上下文,通常有两种方法:

使用if/elif语法,您可以获得最相似的switch case版本:

my_value = 10;
if my_value == 10:
    print("The number is ten")
elif my_value == 2*10:
    print("The number is the double of ten")
elif my_value == 100:
    print("The number is one hundred")
else:
    print("The number is none of 10, 2*10 or 100")

另一种不太常见的方法是制作dict,并在开关/机箱的每个条件下分配要调用的相应函数:

my_value = 10;

def def_action():
    print("The number is none of 10, 2*10 or 100")

def ten_action():
    print("The number is ten")

def double_ten_action():
    print("The number is ten")

def hundred_action():
    print("The number is one hundred")

{
    10: ten_action,
    2*10: double_ten_action,
    100: hundred_action,
}.get(
    my_value,
    def_action # This is the final else, if no match if found
)()

尽管不太像Pythonic,但在各种情况下,如果有大量代码会降低可读性,那么这一点很有用。

劳烨
2023-03-14

从Python 3.10.0(alpha6于2021年3月30日发布)开始,Python有一个官方的语法等价物,称为match

基本语法是:

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

对于较旧的Python版本,如果您不想使用if-elif-etc,则只有变通方法。看看这个优秀的社区帖子,了解一些。

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")

因此,其他涉及变通方法的答案不再有效——从性能的角度来看也是如此。

如果来自支持开关大小写的语言,您可能已经知道它们的行为。但是,对于Python,有一些差异需要注意。

>

  • 案件不会失败

    带有switch-case语句的语言通常会从上到下执行值匹配的每个case。因此,如果您不想失败,则在switch-case构造中使用第三条语句-break

    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.");
    }
    

    在这个例子中,前两个案例将被执行,因为第一个案例失败了。如果在第二个案例中没有broch语句,则将执行所有案例,包括默认案例。

    在Python中,只执行第一个匹配的案例。您可以将其视为每个案例都包含一个隐藏的break语句。

    变量引用不能作为条件使用

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

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

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

    不管怎样,像大小写“red”这样的文字: 和限定(即虚线)名称,如case-AllColors。红色按预期工作-无需害怕它们。

    所有这一切都是这样的,因为Python软件基金会并没有决定只复制另一个枯燥的控制流模型,而是实际上实现了一个完全成熟的模式匹配器,它不仅仅是一个代码>开关< /C> > <代码> CASE < /Cord>语句。更多关于这方面的信息可以在下一节中找到。

    match-match不是case hooey

    在Python增强建议(PEP)编号634-636中提供的规范和信息

    在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条件下不能匹配单个变量引用:实际上并没有匹配该变量的值,但实际上引入了一个相同名称的占位符!因此,如果要按如下方式打印所选颜色

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

    它实际上会打印出来

    我们的底色是绿色

    因为base\u color现在是一个占位符,它被分配了所选颜色的值。

    这种高级模式匹配还有很多用例,Python文档中提到了其中的一对有趣的用例。

    在Python3.10获得应有的采用之前,这需要时间。Python 3.1.0将于2021年10月4日发布稳定,这意味着它可能包含在Ubuntu 22.04和UP中。

    如果你只是想玩游戏,为自己编写程序,将它们部署到你自己的服务器上,或者如果你打算以打包的形式而不是简单的源代码文件分发你的作品,那么在你的程序中尝试一下这个新功能吧——这将是一个好处!

    对于Windows和macOS用户,此页面提供官方安装程序下载。

    在Debian和Ubuntu上,您可以使用非常流行的“死蛇”——项目PPA:

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

    Docker是一个在完全隔离的环境中使用Python 3.10的选项,无需任何复杂的设置步骤。

    docker run-it python:3.10.0a6-alpine

    就这样。随着时间的推移,新的alpha或beta版本可能会发布。然后,您需要用不同的版本替换a6。

  •  类似资料:
    • 问题内容: 我想知道,是否有Python等效的case语句,例如VB.net或C#上可用的示例? 问题答案: 例如: 然后,调用等效的开关块: 如果你严重依赖失败,就会开始崩溃。

    • 我想按节组织我的代码。通常我使用,但当我试图在.swift文件中这样做时,它就不起作用了。 所以我的问题是,我是否能够以某种方式启用它,如果不能,那么如何在.swift文件中组织代码?

    • 我尝试使用numpy阵列执行以下操作: 这应该给出一个结果: 但如果输入向量是numpy数组: 它(预期)返回一个: 问题是,在此之后,我需要将结果转换回numpy数组。 我想知道的是,如果有一个有效的numpy函数可以避免这些来回的转换,那该怎么办?

    • 我仍然在学习和试验JavaFX中的GUIs,我似乎无法得到我所希望的“外观”…我试图在一个面板中分组几个标签,然后在另一个面板中添加另一个标签。但我似乎不知道如何在JavaFX中正确使用“JPanels”? 如有任何帮助,将不胜感激 编辑:这是我试图通过尝试不同的布局来实现的,但运气仍然不好

    • 在Mac和Windows上,可以使用 <罢工> (替换 )和 (替换 ) (Docker 18.03+)位于容器内。 对于Linux来说,有没有一个可以在不传递env变量或使用各种CLI命令提取它的情况下开箱即用的方法?

    • 我们有以下场景:使用Sonarqube扫描Windows10中的两个项目。 null 提前谢了。