2011-01-19 15 views
11

Pythonの条件文でかっこの使用に関する簡単な質問があります。Pythonのかっこの条件式

次の2つのスニペットはまったく同じように機能しますが、これは単純さのためにのみ該当するのだろうかと思います。括弧

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

から比較がブール前に行われる他の回答を区別するために

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

は100%正しいです。あなたsocket.gethostnameするために別のコールを保存し、それが簡単に追加追加することができ

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

:あなたはまた、条件を結合する方法として、これを使用することができます(あなたが実証されたもののような状況のために)別の方法として可能な有効な値は、プロジェクトが成長したり、追加のホストを認可しなければならないときです。

8

この場合、かっこは冗長です。比較はブール演算子よりも優先順位が高いため、比較は常にかっこに関係なく実行されます。

  1. 乗算と除算最初
  2. 加算と減算他のすべての周りの次
  3. カッコ、私は一度(おそらく実用的なCプログラミングで)見たガイドラインを言っ

    はこのような何かを言いました

(はい、IIRC彼らは、べき乗を残し!)

優先ルールは、元のプログラマーも保守プログラマーもコードを読んでいないので、誰もそれらを覚えていないはずがないように秘訣があるので、明示的にする方が良いです。本質的に、かっこは、コンパイラに意図を伝えるために、そしてそれを処理しなければならない次のschmoeのためのドキュメントとして役立ちます。

これらの2つのステートメントは同じバイトコードを生成するので、効率を失うことさえありません。

+0

Cの演算子の優先順位は奇妙です。 Pythonはそうではありません。だから、Pythonでは、括弧はCのようにしばしば保証されているわけではありません。 – delnan

+2

しかし、Pythonのイディオム「明示的なものは暗黙的なものよりも優れています」もあります。混乱の可能性がある場合は、スティックを入れてください。 – Wilduck

+2

ええ、CはPythonよりはるかに奇妙です。それでも、さまざまな言語の中でそれらをまっすぐに維持しようとすると、それ自体が混乱の原因になる可能性があります。 – kindall

5

括弧は操作の順序を強制します。 'and'のようにあなたの条件に追加の部分があった場合は、かっこを使用して、 'and'と 'pairing'を指定することをお勧めします。

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

Pythonや他の多くのプログラミング言語では、複数の演算子を持つすべての式に括弧は必要ありません。これは、演算子が優先順位が定義されているためです。 Pythonの演算子の優先順位については、表here(5.15節)を参照してください。

算術に類推することができます。これらの式は等価です:

5 * 5 + 3 

(5 * 5) + 3 

あなたが最初の3を追加することを意味している場合、あなたはこのような括弧を使用する必要があります。

5 * (5 + 3) 
0

the manualを見てください。あなたがリストに上がっているほど、オペレータは後で適用されます。 "または" is above "=="であるため、この特定のケースでは、回答は同じです。しかし、わかりやすくするために、括弧を付けることをお勧めします。