Python Conditionals中的括号

时间:2011-01-19 20:37:38

标签: python conditional parentheses

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

以下两个片段的工作方式相同,但我想知道这是否属实,因为它的简单性;

>>> 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

有人能帮忙解释一下吗?他们在任何情况下都应该使用它们吗?

6 个答案:

答案 0 :(得分:36)

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

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

这样可以节省对socket.gethostname的单独调用,并且可以在项目增长时更容易添加其他可能的有效值,或者您必须授权其他主机。

答案 1 :(得分:9)

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

那就是说,我曾经看过的指南(也许是 Practical C Programming)这样的话:

  1. 首先是乘法和除法
  2. 下一个加法和减法
  3. 围绕其他一切的括号
  4. (是的,IIRC他们没有取代指数!)

    这个想法是,优先规则足够晦涩,以至于没有人应该记住它们,原始程序员和维护程序员都不会记住这些规则,因此最好将其明确化。本质上,括号既用于将意图传达给编译器,也用作下一个必须处理它的schmoe的文档。

    我相信Python这两个语句会产生相同的字节码,所以你甚至不会失去任何效率。

答案 2 :(得分:7)

括号只是强制执行操作。如果您在条件中有一个额外的部分,例如'和',则建议使用括号来表示哪个'或'那'和'配对。

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

区别于

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

答案 3 :(得分:2)

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

你可以用算法来比喻。这些表达式是等价的:

5 * 5 + 3

(5 * 5) + 3

如果你想先添加三个,那么你需要使用这样的括号:

5 * (5 + 3)

答案 4 :(得分:0)

看看the manual。您在列表中的位置越高,稍后将应用运算符。 “或”在“==”之上,因此,在这种特殊情况下,答案是相同的。但是,为了便于阅读,我建议使用括号。

答案 5 :(得分:0)

我一直以为这是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将更具可读性,但是现在已经不那么重要了)