【问题标题】:Parentheses in Python ConditionalsPython 条件中的括号
【发布时间】:2011-06-12 01:02:25
【问题描述】:

我有一个关于在 Python 的条件语句中使用括号的简单问题。

以下两个 sn-ps 的工作原理相同,但我想知道这是否仅仅是因为它的简单性:

>>> import os, socket
>>> if ((socket.gethostname() == "bristle") or (socket.gethostname() == "rete")):
...     DEBUG = False
... else:
...     DEBUG = True
... 
>>> DEBUG

现在没有括号

>>> import os, socket
>>> if socket.gethostname() == "bristle" or socket.gethostname() == "rete":
...     DEBUG = False
... else:
...     DEBUG = True
... 
>>> DEBUG

任何人都可以帮助阐明这一点吗?在任何情况下我一定要使用它们吗?

【问题讨论】:

    标签: python conditional-statements parentheses


    【解决方案1】:

    在这种情况下括号是多余的。比较具有比布尔运算符更高的优先级,因此无论括号如何,都会始终先执行比较。

    也就是说,我曾经看到的一个指南(可能在实用 C 编程中) 是这样说的:

    1. 先乘除法
    2. 下一个加减法
    3. 其他所有内容的括号

    (是的,IIRC 他们忽略了求幂!)

    这个想法是优先规则足够神秘,不应该期望没有人能记住它们,无论是原始程序员还是阅读代码的维护程序员,所以最好将其明确。从本质上讲,括号既可以将意图传达给编译器,也可以作为下一个必须处理它的 schmoe 的文档。

    我相信在 Python 中这两个语句会生成相同的字节码,因此您甚至不会失去任何效率。

    【讨论】:

    • C 的运算符优先级很奇怪。 Python的不是。因此,在 Python 中,括号并不像在 C 中那样频繁。
    • 但也有 python 成语“显式胜于隐式”。如果有可能造成混淆,请坚持下去。
    • 是的,C 比 Python 更奇怪。尽管如此,试图将它们直接放在一种使用的各种语言中可能会造成混淆。
    【解决方案2】:

    括号只是强制操作顺序。如果条件句中有附加部分,例如 and,建议使用括号来指示 and 与哪个 or 配对。

    if (socket.gethostname() == "bristle" or socket.gethostname() == "rete") and var == condition:
        ...
    

    区别

    if socket.gethostname() == "bristle" or (socket.gethostname() == "rete" and var == condition):
        ...
    

    【讨论】:

      【解决方案3】:

      比较发生在布尔值之前的其他答案是 100% 正确的。作为替代方案(对于您所演示的情况),您也可以将其用作组合条件的一种方式:

      if socket.gethostname() in ('bristle', 'rete'):
        # Something here that operates under the conditions.
      

      这为您节省了对 socket.gethostname 的单独调用,并且随着项目的增长或您必须授权其他主机,您可以更轻松地添加其他可能的有效值。

      【讨论】:

      • 这并没有回答关于 Python 条件句中括号(!)用法的问题
      • @TheGodfather - 对不起?声明“比较发生在布尔值之前”解释了在这种情况下使用这些括号是不必要的。然后它继续提供更清洁、更易读的实现。这也被接受了将近 9 年。
      【解决方案4】:

      在 Python 和许多其他编程语言中,并不是每个具有多个运算符的表达式都需要括号。这是因为运算符具有定义的优先级。有关 Python 中运算符优先级的信息,请参阅表 here(第 5.15 节)。

      你可以类比算术。这些表达式是等价的:

      5 * 5 + 3
      
      (5 * 5) + 3
      

      如果你的意思是先加三个,那么你需要像这样使用括号:

      5 * (5 + 3)
      

      【讨论】:

        【解决方案5】:

        看看the manual。您在列表中的位置越高,该运算符将在稍后应用。 "or" 高于 "==" ,因此,在这种特殊情况下,答案是相同的。但是,为了便于阅读,并且为了确保起见,我建议使用括号。

        【讨论】:

          【解决方案6】:

          我一直认为这是PEP8 的一部分,但显然不是。但是,在您在 PEP、代码示例和文档中遇到的所有示例中,您永远不会看到多余的括号(例如,在 PyCharm 中甚至有这样的检查)。

          一般建议仅在提高可读性或您确实想更改表达式计算顺序(例如(a or b) and c)时才使用括号。

            if (first_expr or second_expr) and third_expr:    
          
            if first_expr or second_expr:
          

          不要

            if ((first_expr or second_expr) and third_expr):    
          
            if (first_expr):
          
            if (first_expr or (second_expr and third_expr)):
          

          在您的代码示例中,括号是完全多余的,只需使用 if socket.gethostname() == "bristle" or socket.gethostname() == "rete":(在生产代码中,in 的可读性当然会更高,但现在这已经离题了)

          【讨论】:

            猜你喜欢
            • 2012-09-27
            • 2012-11-09
            • 2018-12-28
            • 2010-09-27
            • 2021-10-28
            • 1970-01-01
            • 1970-01-01
            • 2023-03-31
            • 1970-01-01
            相关资源
            最近更新 更多