【问题标题】:Perform a function on result of another function if not none如果不是,则对另一个函数的结果执行一个函数
【发布时间】:2020-02-01 23:51:31
【问题描述】:

我有一小段代码,其中包含两个函数。 如果它收到响应,我想调用第一个函数,然后对该响应执行一个函数。然后将结果分配给另一个变量。

以详细的方式看起来像:

result = get_something()
if result:
    answer = transform(result)

我也可以这样做

if get_something():
    answer = transform(get_something())

但这需要调用第一个函数两次

有没有办法在一行上完成所有这些操作,有点像三元(可能是 lambda)

answer = transform(result) if get_something() else None

显然在上面没有说明结果是什么,但我基本上需要说result = get_something()在哪里

我可以在列表理解中做到这一点,但这似乎有点愚蠢

   answer = [transform(x) for x in [get_something()] if x][0]

【问题讨论】:

  • 所以当get_something() 返回 None 时,answer 应该保持未定义?
  • @ababak 是的,不是未定义它应该是无
  • 那是错误的:1) one-lier 不会使您的案例更具可读性 2) 您不必调用第一个函数两次 3) 并且 answer 不应保持未定义以防万一对它的任何潜在引用

标签: python conditional-statements ternary-operator


【解决方案1】:

在最新的 Python 版本 (Python 3.8) 中,有一个可能对您有用的新作业,:=

新语法:= 将值分配给变量作为更大表达式的一部分。因其酷似海象的眼睛和獠牙,被人们亲切地称为“海象操作员”。

if (n := len(a)) > 10:
    print(f"List is too long ({n} elements, expected <= 10)")

在本例中,赋值表达式有助于避免调用 len() 两次:

【讨论】:

    【解决方案2】:

    我们可以在 Python 3.8 中使用assignment expressions

    if (result := get_something()) is not None:
        # do something with result
    

    【讨论】:

      【解决方案3】:

      虽然我不完全理解以这种方式做事的原因(这比其他任何方式都不太清楚),但这里有一个使用 lambda 的示例:

      >>> def get_something(flag):  # Added the flag argument, to mimic different return values
      ...     return 5 if flag else None
      ...
      >>> answer = (lambda func, arg: func(arg) if arg else None)(int, get_something(True))
      >>> answer
      5
      >>> answer = (lambda func, arg: func(arg) if arg else None)(int, get_something(False))
      >>> answer
      >>>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-26
        • 1970-01-01
        • 1970-01-01
        • 2022-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多