【问题标题】:Which of `if x:` or `if x != 0:` is preferred in Python?`if x:` 或 `if x != 0:` 中的哪一个在 Python 中是首选?
【发布时间】:2011-03-14 02:24:41
【问题描述】:

假设x 是一个整数,构造if x: 在功能上与Python 中的if x != 0: 相同。一些语言的风格指南明确禁止前者——例如,ActionScript/Flex 的风格指南指出,你永远不应该为这种事情隐式地将 int 强制转换为 bool。

Python 有偏好吗?最好是指向 PEP 或其他权威来源的链接。

【问题讨论】:

  • 如果你的老板是 C 人,前者可能会给你加分。 :-)
  • 嘿,如果我的任何老板非常关心风格标准,我就不必问这个问题了。 ;)
  • 我见过很多 C 和 C++ 编码风格,当 x 不是布尔表达式(即比较或布尔运算符)时,它们不赞成诸如 if (x) 之类的东西,也不是bool(或 C89 的类似自定义类型,例如 Win32 BOOL)。

标签: python coding-style conditional


【解决方案1】:

构造:if x: 通常用于检查布尔值。

对于ints,使用显式x != 0 是首选 - 按照显式优于隐式 (PEP 20 - Zen of Python) 的思路。

【讨论】:

  • 我更喜欢if x: 而不是if x != 0:,因为它更简单。 “显式优于隐式”可以用来证明if x is True: 甚至if x == True: 的合理性。 :-)
  • @Alok - 这是您的个人喜好,这很好。但是if x: 是用于测试布尔值而不是整数的 Pythonic 习惯用法。
  • @Yuval A:你是说if x: 应该只用在x 计算为bool 类型的地方吗? if x: 是“一般”,也用于x 指容器——你更喜欢更明确的if len(x) != 0: 吗??
  • @Alok:别傻了。这只是常识的应用。 "if x != 0" 在上下文中清楚地表明它是一个数字,因此有助于提高可读性。这在 Code Complete 某处或某处提到过,所以如果你不相信我,请听那个人。
  • 如果x语义布尔值,不管它的实际类型是什么,都可以写if x:。但是,如果它被视为其他东西(例如数字),并且检查是针对 数字 (例如,您正在检查 0 以避免被零除),那么缩短它是误导。
【解决方案2】:

这里没有硬性规定。以下是我会使用的一些示例:

假设我正在连接某个函数,该函数在错误时返回 -1,在成功时返回 0。这样的函数在 C 中很常见,当使用包装 C 函数的库时,它们经常出现在 Python 中。在这种情况下,我会使用if x:

另一方面,如果我要除以x 并且我想确保x 不是0,那么我将明确写成if x != 0

作为一个粗略的经验法则,如果我在整个函数中将x 视为bool,那么我很可能会使用if x:——即使我可以证明x 将是一个@ 987654330@。如果将来我决定将bool(或其他类型!)传递给函数,我不需要修改它。

另一方面,如果我真的像int 一样使用x,那么我很可能会拼出0

【讨论】:

    【解决方案3】:

    通常,我读到:

    if(x) 是关于存在的问题。

    if( x != 0) 是一个关于数字的问题。

    【讨论】:

    • 不完全正确。 PEP 8(Python 风格指南)特别指出“当你真正的意思是 if x is not None 时,小心写 if x
    • @Yuval:我就如何解释 if 的两种形式的含义提供我的观点。
    • 很公平,只是对未来 Python 用户的一个友好警告 :)
    • 存在吗?你的意思是“容器的空虚”吗?在任何情况下,if 语句中有多余括号且不遵守 PEP 8 间距的代码只能被解读为厄运的预兆 :-)
    • @Yuval:a 是否存在对不同的人意味着不同的事情。如果a 不存在,我希望if a: 提高NameError! :-)。
    【解决方案4】:

    这取决于你想要什么;如果x 是一个整数,它们是等价的,但您应该编写符合您的确切意图的代码。

    if x:
        # x is anything that evaluates to a True value
    if x != 0:
        # x is anything that is not equal to 0
    

    【讨论】:

      【解决方案5】:

      如果您想在布尔上下文中测试 x

      if x:
      

      更明确,对于 x 有效性(不匹配空容器):

      if x is not None:
      

      如果您想在整数上下文中严格测试:

      if x != 0:
      

      最后一个实际上是隐式比较类型。

      【讨论】:

        【解决方案6】:

        我是否可以建议,在这个问题上的争吵足以回答它?

        有些人认为它“如果 x”应该只用于 Z,其他人用于 Y,其他人用于 X。

        如果这样一个简单的陈述能够引起如此大惊小怪,对我来说很明显,这个陈述不够清楚。写下你的意思。

        如果要检查 x 是否等于 0,则写“if x == 0”。如果要检查 x 是否存在,请写“if x is not None”。

        那么就没有混乱,没有争论,没有辩论。

        【讨论】:

          【解决方案7】:

          if x != 0:相比,if x is not 0: 不是 Python 中的首选方法吗?

          是的,前者写的有点长,但我的印象是isis not==!= 更受欢迎。这使得 Python 作为一种自然语言比作为一种编程语言更容易阅读。

          【讨论】:

          • 错了。这是 CPython 的一个实现细节,小整数(包括 0)被实习。所以使用“is”适用于 0 而不是 666。0 is 3 + (-3) 产生 True666 is 333 + 333 产生 False
          猜你喜欢
          • 1970-01-01
          • 2011-02-12
          • 1970-01-01
          • 2019-07-15
          • 2013-12-23
          • 1970-01-01
          • 2012-11-04
          相关资源
          最近更新 更多