2011-01-19 43 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。列表中的值越高,操作員將在稍後應用。 「或」在「==」之上,因此在這種特殊情況下答案是一樣的。但是,爲了便於閱讀,並且可以肯定的是,我會建議括號。