Python 中实现 switch 语句,真的有这个必要吗?

最近休假回老家, 就在长沙面了几场 Python 的面试, 也好为以后回老家发展做打算, 不得不说, 这几场面试的面试官都颇为奇葩(还有点自以为是). ( 有点想知道, 整体技术氛围如此, 还是我遇到的只是特例?)

一个例子: Python 中怎么写 switch ?
我: 直接写 if-else 就可以了, 简单清晰, 别人很容易看懂.
对方: (似乎不满意) 我是说, 怎么实现 switch ?
我: ??? 如果非要模拟这种写法, 可以用 dict 做一做分支路由, 可以实现类似 switch 的效果. 不过写 if-else 是最好的, 不花哨, 实用
对方: (似乎还是不满意) 巴拉巴拉… 我觉得你对技术没有热情.
我: ??? ( 我当时就预感接下来会有更多奇葩情况出现, 于是以 『这只是主观问题, 每个人有不同看法, ,口味不同』为由, 快速地跳过了这道题)
果然, 更多奇葩问题出现了, 面完之后, 当即在心中, 将这家公司拉入黑名单.
( 结论: 回老家发展, 可能是一个美好的幻想? 还不如先在一线赚钱, )

上面都是瞎扯淡, 找找共鸣, 大家看看就好 :)

下面是技术问题:
那么, 请教 V 友大佬: Python 中实现 switch, 真的有这个必要吗? 你们平时是如何做的?
Python 中实现 switch 语句,真的有这个必要吗?


19 回复

别说没必要,说不定哪天 python 新版本就真给加上了,,毕竟现在 python 每个新版本都会加新语法


Python里确实没有switch语句,但我觉得这问题挺有意思。其实Python社区早就讨论过很多次了,官方在PEP 634里最终通过的模式匹配(match/case)就是最接近的解决方案。

如果你用的是Python 3.10或更高版本,直接上match就行:

def handle_status(code):
    match code:
        case 200:
            return "OK"
        case 404:
            return "Not Found"
        case 500:
            return "Server Error"
        case _:
            return "Unknown status"

对于老版本,用字典映射是最常见的做法:

def handle_status(code):
    handlers = {
        200: lambda: "OK",
        404: lambda: "Not Found",
        500: lambda: "Server Error"
    }
    return handlers.get(code, lambda: "Unknown status")()

或者用if/elif链,虽然看起来有点啰嗦,但简单直接:

def handle_status(code):
    if code == 200:
        return "OK"
    elif code == 404:
        return "Not Found"
    elif code == 500:
        return "Server Error"
    else:
        return "Unknown status"

有没有必要?看情况。match/case比字典映射更强大,能处理复杂的模式匹配,不只是简单的值比较。但如果你只是几个简单的条件判断,用if/elif或者字典也挺好。

总结:Python 3.10+直接用match,老版本用字典映射。

条件多的话,倾向用字典

PEP-3103 的话,十年前就被拒掉了 https://www.python.org/dev/peps/pep-3103/


之前拒掉也不表示以后不会加,,

年轻就在一线赚钱吧……一线玩的 high 啊。
家里挺富裕那就无所谓了。

我觉得当大家面试遇到奇葩问题的时候,应该转变一下想法,面试官出题的主要意图不是这道题有什么意义,更多的是考察以你的能力是否实现。能实现不代表实际中让你去这么应用。

意思是用 c 拓展 支持 switch 语法?

我发现大多数人遇到一个自己答不出来的陌生问题,第一反应是反驳这道题有什么意义。

是没这必要。不过就像有的面试问你排序,实际开发中谁自己写排序?面试主要是看你的思维模式及解决问题的能力,我是觉得这个面试官没毛病。

赞同楼上,的确别人问你怎么实现,你回答有什么意义,他再问你,显然面试官没毛病。

有必要,原因是,写单元测试的时候可以少写很多。

加一。 不过觉得说到 dict 也就够了,面试官还不满意是想听到什么答案呀……

我并没有针对这道题而谈,我只是觉得题目是否有意义并不是大家吐槽面试官的槽点。不会就答不会就行了,避重就轻的说了一大趴啦自认为的最佳实践,难道面试官不知道这些东西吗?只会拉低面试官对你的印象而已。

赞同楼主,没意义的问题。
退一步讲楼主你也讲了实现的思路了呀,条件分支多的话搞一个字典,这不就结了么。不知道那位面试官还想怎么样。

没意义是没意义,但是面试官问的问题,会就答就好了。说自己觉得那个那个才是最好,也不说会不会,这样给人感觉就是很高傲。第一遍就不满了,第二遍还要强调一遍 if 才是最佳的,这明显面试官会不满。

三个以内条 if,超过 3 条以上字典模拟 switch

其实你要学习一点:
有人问你一个「明显」没有意义的问题时,这个人明显带有意义,而且这个意义和问题本身内容无关

例如:
你把月亮摘下来
我和你妈掉到水里,先救谁

换个公司

回到顶部