python:通过if / elif语句管道化一个值

这个问题在这里已经有了答案:

  • 替代Python中的switch语句? 44个答案

  • 可能不是你想要的,但一种选择是使用函数字典:

    def do_a();
        ..
    def do_b();
        ..
    def do_c();
        ..
    
    strategy = {
        a: do_a,
        b: do_b
        c: do_c
    }
    
    strategy[f()]()
    

    但是,通常情况下,如果字典条目未找到,您可能需要进行一些错误处理,在这种情况下,您最终可能会得到一个单独的变量,再加上您现在必须将每个个案提取到自己的函数中。

    也许更不相关,如果只有两种情况你可以使用三元运算符:

    do_a() if f() == a else do_b()
    

    虽然可能你已经知道这一点,再加上你的问题有两种以上的情况,再加上很多人不喜欢三元运算符,但无论如何。

    如果你有一个带有switch语句的语言,比如C#/ Java / C ++等,或者模式匹配语句,比如Haskell / OCaml / F#/ Scala / Erlang等等,那么你可以使用它们。 模式匹配语句如下所示:

    match f() with
    | a ->
        // do something
        // and maybe something else too
    | b ->
        // do some other thing
        // and yet some other thing
    

    但Python中没有这样的功能。


    如果你只想映射答案(没有进一步计算),那么你可以用一个简单的映射函数来解决它(类似于junichiro的答案):

    import random
    
    def f():
        foo = ['a', 'b', 'c', 'd', 'e']
        return random.choice(foo)
    
    if __name__ == '__main__':
        from_to = dict(a=2, b=1, c=3, d=4, e=5)
        print(from_to.get(f(), None))
    

    如果你有一个来自f()的不可预见的值,那么from_to.get(f(), None)默认为None


    if / elif没有办法做到这一点,Python没有switch语句。 你需要临时变量。

    如果您知道a,b和c的确切值,您可以使用调度表。 这有点冗长,但如果你有很多可能的分支,它会更快,并且可能更容易遵循。

    制作派送表:

  • 为每个分支做一个功能
  • 制作一个将a,b,c映射到相应函数的字典
  • 将所有代码替换为return DISPATCH_TABLE[f()]()
  • 你可以在这里找到一些例子。

    链接地址: http://www.djcxy.com/p/42767.html

    上一篇: python: Piping a value through an if/elif statement

    下一篇: Python if, elif, else chain alternitive