2011-01-19 26 views
11

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

下面两个代码片段的工作原理是一样的,但我不知道这是否是真的,因为它很简单;

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

任何人都可以帮助阐明这一些轻?他们的任何情况下,我一定要使用它们吗?

回答

32

区分其他的答案是比较发生之前,布尔是100%正确。作为替代(像你证明什么情况下),你也可以用这样的一种方式的条件相结合:

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

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

8

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

这就是说,一个指引我曾经看到(或许在实用C语言编程)说是这样的:

  1. 乘除第一
  2. 加法和下一周围一切
  3. 括号减法

(是的,IIRC他们排除了指数!)

这个想法是,优先规则足够神秘,以至于没有人应该期望任何人都记住它们,既不是原始程序员也不是维护程序员阅读代码,所以最好将其明确。实质上,括号既可以将意图传达给编译器,也可以作为下一个必须参与编写的schmoe的文档。

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

+0

C的运算符优先级很奇怪。 Python的不是。所以在Python中,parens几乎没有c中那么经常。 – delnan 2011-01-19 21:44:31

5

圆括号只是强制操作的顺序。如果在条件语句中还有其他部分,如'和',则最好使用括号来表示该'和'与哪个'或'配对。

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

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

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

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

5 * 5 + 3 

(5 * 5) + 3 

如果你的意思是添加三个第一,那么你需要使用圆括号这样的:

5 * (5 + 3) 
0

看一看the manual。列表中的值越高,操作员将在稍后应用。 “或”在“==”之上,因此在这种特殊情况下答案是一样的。但是,为了便于阅读,并且可以肯定的是,我会建议括号。