【问题标题】:python: Piping a value through an if/elif statement [duplicate]python:通过if / elif语句管道值[重复]
【发布时间】:2018-05-30 01:38:17
【问题描述】:

我有一个函数可以返回三个值之一: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

【问题讨论】:

  • 为什么要这样做?创建临时变量有什么问题?
  • @darthbith 我试图最小化我创建的变量数量。我想,更多的是个人喜好。

标签: python if-statement


【解决方案1】:

可能不是您想要的,但一种选择是使用函数字典:

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

【讨论】:

  • if else 块旨在有条件地执行代码。三元运算符旨在有条件地计算出一个值。我很确定当人们使用它来执行一个或另一个语句时,对三元运算符有问题的人只是不喜欢它,因为这就是 if else 语句的用途。
  • @TadhgMcDonald-Jensen 你说得对,我在上面使用它的方式很糟糕,但是很多人似乎有一个问题,即使它被用来评估一个值。理想情况下,我更喜欢使用尽可能多的纯函数,并且只在绝对必要时“做”某事(改变状态)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    使用 if/elif 无法做到这一点,并且 Python 没有 switch 语句。您需要临时变量。

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

    制作调度表:

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

    你可以找到一些例子here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-28
      • 2015-01-16
      • 1970-01-01
      • 2017-02-10
      • 2014-05-13
      • 2017-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多