在 Python 中切换

新手上路,请多包涵

我试过在 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 中找到了一些开关示例,它们遵循这种结构。谁能帮我?

原文由 X-Pender 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 470
2 个回答

(a) 我看不出 if…elif…else 有什么问题

(b) 我认为 python 没有 switch 语句的原因与 Smalltalk 没有的原因相同:它几乎是完全多余的,并且在您想要打开类型的情况下,您可以向类中添加适当的方法;同样,打开值应该在很大程度上是多余的。

注意: 我在评论中获悉,无论 Guido 一开始不创建开关的原因是什么,添加它的 PEP 都被拒绝了,因为对添加此类声明的支持极其有限。请参阅:http: //www.python.org/dev/peps/pep-3103/

© 如果您确实需要切换行为,请使用哈希表( dict )来存储可调用对象。结构是:

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

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

原文由 Marcin 发布,翻译遵循 CC BY-SA 3.0 许可协议

long 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)

原文由 snim2 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题