python:通过if/elif语句传递值

python: Piping a value through an if/elif statement

本问题已经有最佳答案,请猛点这里访问。

我有一个函数可以返回三个值中的一个:A、B或C。

1
2
def f():
    return x # a, b, or c

我需要根据f()的返回值执行不同的语句:a、b或c。我知道的最好的方法是:

1
2
3
4
5
6
7
v = f()
if v == a:
    # Do A
elif v == b:
    # Do B
else:
    # Do C

如果不引入这个新变量v,有没有不同的方法来评估f()的返回值?也许是这样?

1
2
3
4
5
6
if f() == a:
    # Do A
elif _value_from_above == b:
    # Do B
else:
    # Do C


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def do_a();
    ..
def do_b();
    ..
def do_c();
    ..

strategy = {
    a: do_a,
    b: do_b
    c: do_c
}

strategy[f()]()

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

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

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

虽然你可能已经知道了,加上你的问题有两个以上的案例,加上很多人不喜欢三元运算符,但无论如何。

如果你有一个带有开关语句的语言,比如C { /爪哇/C++等,或者模式匹配语句,就像Haskell /OcAML/F·y/Scala/Erlang等的任何一个,那么你可以使用这些语句。模式匹配语句如下所示:

1
2
3
4
5
6
7
match f() with
| a ->
    // do something
    // and maybe something else too
| b ->
    // do some other thing
    // and yet some other thing

但是在Python中没有这样的特性。


如果您只想映射答案(不需要进一步计算),那么您可以用一个简单的映射函数(类似于Junichiro的答案)来解决它:

1
2
3
4
5
6
7
8
9
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()]()替换所有代码

你可以在这里找到一些例子。