python: Piping a value through an if/elif statement
本问题已经有最佳答案,请猛点这里访问。
我有一个函数可以返回三个值中的一个:A、B或C。
1 2 | def f(): return x # a, b, or c |
我需要根据
1 2 3 4 5 6 7 | v = f() if v == a: # Do A elif v == b: # Do B else: # Do C |
如果不引入这个新变量
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)) |
如果您有来自
如果if/elif和python没有switch语句,就无法做到这一点。您需要临时变量。
如果您知道A、B和C的确切值,您也可以使用分派表。它有点冗长,但是如果您有许多可能的分支,那么它将更快,也可能更容易执行。
制作调度表:
- 为每个分支生成函数
- 编一本字典,把A、B、C映射到它们相应的函数上。
- 用
return DISPATCH_TABLE[f()]() 替换所有代码
你可以在这里找到一些例子。