【问题标题】:Python idiom for '... if ... else ...' expression'... if ... else ...' 表达式的 Python 成语
【发布时间】:2011-02-01 12:57:21
【问题描述】:

如何将表达式写得更短:

return '%.0f' % float_var if float_var else float_var

if float_var:
    return formatted_string
else:
    return None

谢谢!

【问题讨论】:

  • “更短”?您的第一个示例显然“更短”。为什么要问哪个更短?您是在要求第三个更神奇地更短的示例吗?由于您的问题显示哪个更短,因此不清楚您需要知道什么。
  • 这两个示例甚至不是相同的代码。除了显而易见的(显然以某种未显示的方式预先计算“formatted_string”),第二个返回None,其中第一个返回float_var,可能是None,或False,或0.0 ,或其他一些东西......谁赞成这些东西?
  • @Peter Hansen:好问题。我什至无法解释这个问题,它已经得到了赞成。我希望投票者会留下一些“+1 ...”的问题,为什么这个问题很酷。
  • @Peter Hansen,@S。 Lott:解释 StackOverflow 问题更像是一门艺术,而不是一门科学。对于下面的答案,我将其解释为“我知道两种编写 if-else 三元条件的方法。有更短的方法吗?我什么时候应该使用其中一种?”

标签: python idioms


【解决方案1】:

表达式<value> if <condition> else <other_value> 已经非常惯用了——当然比其他例子更习惯,并且在<value> 简单的时候可能是首选。这是 Python 的三元运算符,所以如果你正在寻找类似 @​​987654323@ 的东西,那么它不存在。

如果计算<value><other_value> 需要几个步骤,请使用更长的if: ... else: ... 替代方案。

【讨论】:

  • 假设你在 2.5 以后。
  • @Gregg:希望是这样 - 否则您使用的是 2.4 或更早版本,这意味着您的 Python 版本至少有 6 年历史!
  • 查看 Centos5 和其他服务器发行版,John。野外仍然有很多 2.4,呃!
  • 谢谢大家!我的问题看起来很愚蠢,对不起,我知道。我只是尝试学习和使用 python 习语。
【解决方案2】:

我会使用方括号使表达式更具可读性:

return ('%.0f' % float_var) if float_var else float_var

当我第一次看到它时,我认为它是

return '%.0f' % (float_var if float_var else float_var)

这很愚蠢。我不得不尝试一下,以确保它的工作方式。

顺便说一句,您的第一个示例不等同于您的第二个示例

if float_var:
    return formatted_string
else:
    return None

这将始终返回格式化字符串或无。你的第一个例子如果你传入任何评估为 False (False, 0, 0.0, "", [] 等) 将返回不变,所以你的返回类型可以是字符串、布尔值、列表、int、float 等。这是可能不是您想要的,特别是如果 0.0 是 float_var 的合法值。我会将您的代码更改为:

return ('%.0f' % float_var) if isinstance(float_var, float) else None

或者:

try:
    return "%.0f" % float_var
except TypeError:
    return None

将其他整数(和长整数)转换为浮点数。

【讨论】:

  • @Dave,大多数情况下都不错,尽管最后一个替代说明 "%.0f" % False 将返回 "0",这也可能是不可取的。
  • @Peter - 好点,我忘记了 True/False 到 1/0 的自动转换。
  • float 的类型检查始终是一个警告信号。如果这两类期望值是数字和None,则检查is not None 比检查isinstance(foo, float) 更有意义,因为前者仍然允许进行duck 类型的操作。
【解决方案3】:
  • 不清楚你到底想做什么。

    1. 最直接的解释应该是这样的

      >>> float_var = 4.5
      >>> '%.0f' % float_var if float_var else float_var
      '5' # This is a string
      >>> float_var = 0.0
      >>> '%.0f' % float_var if float_var else float_var
      0.0 # This is a float
      

      我几乎可以肯定你不想要。

    2. 我猜你想用“if float_var”检查None?如果是这样,您总是拼写为“if foo is not None”,而不是“if foo”,前者更清晰且不易出错。

      如果那你想要的,我建议你修改你的模型。通过反复返回 None 来传播错误是一件坏事:它丑陋、容易出错且不习惯。请改用异常。

  • 越短并不总是越好。您的 sn-ps 不会很长或很笨拙。事实上,如果您使用它们来避免潜在的错误,您可能希望将它们延长一点

    • 可能有人为此建议滥用or 的短路行为。但是,这会使代码更难阅读,并且不允许您在 None 和其他错误值之间指定,这通常会导致错误。

【讨论】:

    【解决方案4】:

    如果您正在使用v if c else u,那么您已经在使用最易读、最高效的三元运算符了。

    other ways,但它们的可读性较差。

    【讨论】:

      【解决方案5】:
      float_var and "%.0f" % float_vav
      

      是不是很棒?

      【讨论】:

      • Nope: >>> f=0.0 >>> x=f and "%f" % f >>> type(x) >>> f=0.1 >> > x=f and "%f" % f >>> type(x) ... 如果值为 0.0,你得到一个浮点数,否则是一个字符串。
      • 对此我有一些复杂的感觉。真是太棒了。据我了解,它在逻辑上等同于 '%.0f' % float_var if float_var else float_var 但我不会在我的代码中使用它。我觉得很难读。可能只是因为这个技巧对 python 来说不是惯用的,而且我以前从未见过它。不不不,我永远不会这样写!但我印象深刻。
      猜你喜欢
      • 2012-08-20
      • 1970-01-01
      • 2021-10-04
      • 1970-01-01
      • 2018-01-21
      • 2012-10-26
      • 2019-09-04
      • 2015-12-24
      • 1970-01-01
      相关资源
      最近更新 更多