Python中的switch语句

13 投票
8 回答
39946 浏览
提问于 2025-04-17 10:26

我尝试在Python中做一个类似于switch的语句,这样就不用写很多if语句了。

我的代码是这样的:

def findStuff(cds):
    L=[]
    c=0
    for i in range(0, len(cds), 3):
        a=differencesTo(cds[i:i+3])
        result = {
            a[2][0]==1: c=i+1,
            a[2][1]==1: c=i+2,
            a[2][2]==1: c=i+3,
            a[1]==1: L.append((cds[i:i+3], a[0], c))
        } 
    return L

我的问题是,这个不管用。(用if语句是可以的,但我觉得这样写会更好看)。

我找到了一些Python中switch的例子,它们都是这个结构。有人能帮我吗?

8 个回答

3

其他的回答适合旧版本的Python。对于Python 3.10及以上版本,你可以使用match/case,这个功能比一般的switch/case要强大得多。

def something(val):
    match val:
        case "A":
            return "A"
        case "B":
            return "B"
        case "C":
            return "C"
        case _:
            return "Default"

something("A")
7

长长的 if 语句其实没什么问题:

if switch == 'case0':
   do_case0()
elif switch == 'case1':
   do_case1()
elif switch == 'case2':
   do_case2()
...

如果觉得这样写太啰嗦,或者你有很多种情况,可以把它们放在一个字典里:

switch = {'case0': do_case0, 'case1': do_case1, 'case2': do_case2, ...}
switch[case_variable]()
// Alternative:
(switch[case_variable]).__call__()

如果你的条件稍微复杂一点,就需要考虑一下你的数据结构了。例如:

switch = {
    (0,21): 'never have a pension',
    (21,50): 'might have a pension',
    (50,65): 'definitely have a pension',
    (65, 200): 'already collecting pension'
}
for key, value in switch.items():
    if key[0] <= case_var < key[1]:
        print(value)
21

(a) 我不明白 if...elif...else 有什么问题。

(b) 我猜 Python 没有 switch 语句,和 Smalltalk 没有的原因一样:这几乎是多余的。如果你想根据类型来切换,可以给你的类添加合适的方法;同样,根据值来切换也大部分是多余的。

注意:评论里有人告诉我,不管 Guido 最初不创建 switch 的原因是什么,关于添加它的提案都被拒绝了,理由是支持添加这种语句的可能性非常有限。详情见:http://www.python.org/dev/peps/pep-3103/

(c) 如果你真的需要切换的功能,可以使用哈希表(dict)来存储可调用的对象。结构是:

switch_dict = {
    Foo: self.doFoo,
    Bar: self.doBar,
    }

func = switch_dict[switch_var]
result = func() # or if they take args, pass args

撰写回答