我是Python的新手。 请解释为什么python没有switch-case?
答案 0 :(得分:44)
我们曾经考虑过它,但是如果没有办法声明命名常量,就无法生成有效的跳转表。所以我们剩下的就是语法糖,我们已经可以使用if-elif-elif-else链。
大致的理由是,各种提案未能实现人们对转换案例的预期,并且未能改进现有的解决方案(如基于字典的调度,if-elif-chains ,基于getattr的调度或老式多态分派到具有相同方法的不同实现的对象。)
答案 1 :(得分:8)
文档中确实有一节可以回答这个问题。见下文:
Why isn’t there a switch or case statement in Python?
TL; DR:现有的替代方案(通过getattr
或dict.get
,if
/ 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作为间接跳转到相应案例的地址列表。这是无条件的跳转,这意味着比首先进行比较要有效得多(避免出现分支错误预测失败),即使只是在少数情况下,它也被认为效率更高。对于一打或更多(对于设备驱动程序而言多达数百个代码段),构造的优势是毋庸置疑的。我猜拉里·沃尔斯当时并没有谈论集会。