为什么Python没有switch-case?

时间:2017-10-12 03:44:54

标签: python switch-statement

我是Python的新手。 请解释为什么python没有switch-case?

5 个答案:

答案 0 :(得分:44)

我们曾经考虑过它,但是如果没有办法声明命名常量,就无法生成有效的跳转表。所以我们剩下的就是语法糖,我们已经可以使用if-elif-elif-else链。

请参阅PEP 275PEP 3103进行完整讨论。

大致的理由是,各种提案未能实现人们对转换案例的预期,并且未能改进现有的解决方案(如基于字典的调度,if-elif-chains ,基于getattr的调度或老式多态分派到具有相同方法的不同实现的对象。)

答案 1 :(得分:8)

文档中确实有一节可以回答这个问题。见下文:

Why isn’t there a switch or case statement in Python?

TL; DR:现有的替代方案(通过getattrdict.getif / elif链动态调度)涵盖了所有用例。

答案 2 :(得分:3)

def f(x):
    return {
        1 : 'output for case 1',
        2 : 'output for case 2',
        3 : 'output for case 3'
    }.get(x, 'default case')   

你可以在python中使用它作为switch case,如果条件不匹配,如果条件不匹配则返回默认值

答案 3 :(得分:1)

2021 年更新:case 在 Python 3.10 中引入

Structural pattern matching 将包含在 Python 3.10 中,将于 October 2021 发布。

这里是通用语法

match subject:
    case <pattern_1>:
        <action_1>
    case <pattern_2>:
        <action_2>
    case <pattern_3>:
        <action_3>
    case _:
        <action_wildcard>

这是一个简单的例子

def http_error(status):
    match status:
        case 400:
            return "Bad request"
        case 404:
            return "Not found"
        case 418:
            return "I'm a teapot"
        case _:
            return "Something's wrong with the Internet"

答案 4 :(得分:0)

我记得在古代,一个没有经验的Larry Walls说Perl不需要大小写转换构造,因为可以用以下方式完成:“ if-elif-elif .... else”。那时,Perl只不过是黑客小子的脚本工具。当然,今天的Perl有一个switch结构。

几十年后的今天,带着新玩具的新生代孩子注定要重复同样的愚蠢声明,这并不奇怪。

这与成熟有关,男孩。最终将有一个案例构造。并且当python作为FORTRAN / Pascal和C以及从它们派生的所有语言之类的编程语言已经足够成熟时,它甚至会带有“ goto”语句:)

顺便说一句。通常,案例切换转换为asm作为间接跳转到相应案例的地址列表。这是无条件的跳转,这意味着比首先进行比较要有效得多(避免出现分支错误预测失败),即使只是在少数情况下,它也被认为效率更高。对于一打或更多(对于设备驱动程序而言多达数百个代码段),构造的优势是毋庸置疑的。我猜拉里·沃尔斯当时并没有谈论集会。