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

时间:2017-12-15 20:06:49

标签: python if-statement

我有一个函数可以返回三个值中的一个:a,b或c。

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

我需要根据f():A,B或C的返回值执行不同的语句。我知道的最佳方法是:

v = f()
if v == a:
    # Do A
elif v == b:
    # Do B
else:
    # Do C

如果不引入这个新变量v,是否有不同的方法来评估f()的返回值?
可能是这样的事情吗?

if f() == a:
    # Do A
elif _value_from_above == b:
    # Do B
else:
    # Do C

3 个答案:

答案 0 :(得分:4)

可能不是你想要的,但一种选择是使用功能词典:

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中没有这样的功能。

答案 1 :(得分:1)

如果/ elif和Python没有switch语句,则无法执行此操作。你需要临时变量。

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

制作调度表:

  • 为每个分支制作一个功能
  • 制作一张字典,将a,b,c映射到相应的功能
  • 将所有代码替换为return DISPATCH_TABLE[f()]()

您可以找到一些示例here

答案 2 :(得分:1)

如果您只想映射答案(不进一步计算),那么您可以使用简单的映射函数解决它(类似于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