python:通过if / elif语句管道化值[重复]

问题描述 投票:2回答:3

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

我有一个函数可以返回三个值之一: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
python if-statement
3个回答
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
投票

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


1
投票

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

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

制作调度表:

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

你可以找到一些例子here

© www.soinside.com 2019 - 2024. All rights reserved.