46

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

任何人都可以帮助阐明这一点吗?有没有我绝对应该使用它们的情况?

4

6 回答 6

46

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

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

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

于 2011-01-19T20:43:39.313 回答
18

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

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

区别于

if socket.gethostname() == "bristle" or (socket.gethostname() == "rete" and var == condition):
    ...
于 2011-01-19T20:42:00.943 回答
13

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

也就是说,我曾经看到的一条指南(可能在Practical C Programming 中)是这样说的:

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

(是的,IIRC 他们没有取幂!)

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

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

于 2011-01-19T20:40:09.753 回答
9

我一直认为这是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会更具可读性,但现在这是相当离题的)

于 2019-12-04T07:26:57.843 回答
2

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

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

5 * 5 + 3

(5 * 5) + 3

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

5 * (5 + 3)
于 2011-01-19T20:43:49.673 回答
0

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

于 2011-01-19T20:46:08.693 回答