Python中的switch语句
我尝试在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