Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中创建一个Case/Switch而不出现所有中断,并在两个Case之间编写代码_Python_If Statement_Switch Statement - Fatal编程技术网

如何在python中创建一个Case/Switch而不出现所有中断,并在两个Case之间编写代码

如何在python中创建一个Case/Switch而不出现所有中断,并在两个Case之间编写代码,python,if-statement,switch-statement,Python,If Statement,Switch Statement,我知道Java和C,并且我曾经使用Switch语句,但python中没有 我看到了很多使用elif的方法,但是任何一种方法都是完全的 我想要删除的代码示例 switch(expression) { case a: doA(); case b: doB(); case c: doC(); break; case d: case e: doDE() break; case f:

我知道Java和C,并且我曾经使用Switch语句,但python中没有

我看到了很多使用elif的方法,但是任何一种方法都是完全的

我想要删除的代码示例

switch(expression) {
   case a:
       doA();
   case b:
       doB();
   case c:
       doC();
       break;
   case d:
   case e:
       doDE()
       break;
   case f:
   case g:
       doFG():
   case h:
       doH();
       break;
   case i:
       doI();
   default:
       foo();
       break;
}
正如您所看到的,并不是所有的case后面都是break,有些case之间的代码只在一个case中执行,但也有在两个case中执行的公共代码

我看到了很多方法,但任何一种方法都可以同时做到这一点。我认为这就是if-elif-else和switch-case之间的真正区别

因此,有任何方法可以做到这一点,这将是伟大的,或者它只可能与重复的函数调用和复杂的,如果与所有的可能性


谢谢。

switch语句被认为是有害的。这可能就是Python没有它的原因。故障行为是C代码中错误的主要来源。很容易忘记一个
中断这就是为什么C#不允许它——你必须使用显式的
goto
。Python的函数目录方法也是如此。您对下一个函数进行了调用。“显性比隐性好”

对函数进行dict(使用标识符键)的最简单方法是使用
声明

class switch:
    def a():
        print('a')
        switch.b()
    def b():
        print('b')
        switch.c()
    def c():
        print('c')
    def d():
        switch.e()
    def e():
        print('de')
    def f():
        switch.g()
    def g():
        print('fg')
    def h():
        print('h')
    def i():
        print('i')
        switch.default()
    def default():
        print('foo')
像这样使用它

>>> expression = 'a'
>>> getattr(switch, expression, 'default')()
a
b
c
如果需要实际的dict,还可以提取
\uuuu dict\uuu
属性

>>> switch.__dict__.get('e', 'default')()
de

如果使用
if
语句,也可以使用类似的显式语句

def switch(case)
    if case == a:
        doA()
        case = b
    if case == b:
        doB()
        case = c
    if case == c:
        doC()
        return
    if case == d:
        case = e
    if case == e:
        doDE()
        return
    if case == f:
        case = g
    if case == g:
        doFG()
        case = h
    if case == h:
        doH()
        return
    if case == i:
        doI()
    foo()
如果您担心改变条件的副作用,或者如果条件比简单相等更复杂,并且您不想重复它们,那么可以使用helper变量,而不是重新指定
case

def switch(case):
    fall = False
    if case == a:
        doA()
        fall = True
    if fall or case == b:
        doB()
        fall = True
    if fall or case == c:
        doC()
        return
    if case == d:
        fall = True
    if fall or case == e:
        doDE()
        return
    if case == f:
        fall = True
    if fall or case == g:
        doFG()
        fall = True
    if fall or case == h:
        doH()
        return
    if case == i:
        doI()
    foo()

if
语句可以执行任何条件。你只需要更明确一点

def switch(case):
    if case in 'a':
        doA()
    if case in 'ab':
        doB()
    if case in 'abc':
        doC()
        return
    if case in 'de':
        doDE()
        return
    if case in 'fg':
        doFG()
    if case in 'fgh':
        doH()
        return
    if case in 'i':
        doI()
    foo()

我看到了这篇文章:,但我没有找到任何解决方案能给我一个完整的解决方案。把案例分解成函数,把函数放到字典里。具有本应“失效”的函数,只需调用下一个函数即可。可能是麻烦太多了。我一生中从未需要过如此巨大的
开关
if
语句。你确定你的代码没有做错什么吗?你能给我们一些背景资料,以便我们能提出替代解决方案吗?它没有上下文,我想要案例陈述,我想知道是否有一个解决方案,允许所有案例的组合。谢谢大家,我认为最好的解决方案是由glich给出的。我知道如果你可以做任何情况,但我看到了许多复杂的方法来模拟案例的句法,但所有人都必须做一些额外的事情,或者不允许与“案例”陈述完全相同。我认为我现在找到的最好的解决办法是使用一个类,在一个案例结束时调用下一个类,如果我不想破坏的话。谢谢。我看到了许多复杂的解决方案,但任何像这样简单和复杂的解决方案,我想避免在没有中断的情况下调用显式的下一个“case”,但这很容易理解,我认为这是模拟case语法的一个好方法。