Python 中实现 switch 语句,真的有这个必要吗?
最近休假回老家, 就在长沙面了几场 Python 的面试, 也好为以后回老家发展做打算, 不得不说, 这几场面试的面试官都颇为奇葩(还有点自以为是). ( 有点想知道, 整体技术氛围如此, 还是我遇到的只是特例?)
一个例子: Python 中怎么写 switch ?
我: 直接写 if-else 就可以了, 简单清晰, 别人很容易看懂.
对方: (似乎不满意) 我是说, 怎么实现 switch ?
我: ??? 如果非要模拟这种写法, 可以用 dict 做一做分支路由, 可以实现类似 switch 的效果. 不过写 if-else 是最好的, 不花哨, 实用
对方: (似乎还是不满意) 巴拉巴拉… 我觉得你对技术没有热情.
我: ??? ( 我当时就预感接下来会有更多奇葩情况出现, 于是以 『这只是主观问题, 每个人有不同看法, ,口味不同』为由, 快速地跳过了这道题)
果然, 更多奇葩问题出现了, 面完之后, 当即在心中, 将这家公司拉入黑名单.
( 结论: 回老家发展, 可能是一个美好的幻想? 还不如先在一线赚钱, )
上面都是瞎扯淡, 找找共鸣, 大家看看就好 :)
下面是技术问题:
那么, 请教 V 友大佬: Python 中实现 switch, 真的有这个必要吗? 你们平时是如何做的?
Python 中实现 switch 语句,真的有这个必要吗?
别说没必要,说不定哪天 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
其实你要学习一点:
有人问你一个「明显」没有意义的问题时,这个人明显带有意义,而且这个意义和问题本身内容无关
例如:
你把月亮摘下来
我和你妈掉到水里,先救谁
换个公司


