我有一个函数可以返回三个值中的一个: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
答案 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的确切值,也可以使用调度表。它有点冗长,但如果你有很多可能的分支,它会更快,也可能更容易理解。
制作调度表:
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