这个问题在这里已有答案:
我有一个函数可以返回三个值之一: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
可能不是你想要的,但一种选择是使用函数字典:
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
如果/ elif和Python没有switch语句,则无法执行此操作。你需要临时变量。
如果您知道a,b和c的确切值,也可以使用调度表。它有点冗长,但是如果你有很多可能的分支,它会更快,也可能更容易理解。
制作调度表:
return DISPATCH_TABLE[f()]()
替换所有代码你可以找到一些例子here。