web-dev-qa-db-ja.com

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

誰かがこれにいくつかの光を当てるのを手伝ってもらえますか?私は間違いなくそれらを使用する必要がありますか?

26
Flowpoke

ブール値の前に比較が行われるという他の答えは、100%正しいです。別の方法として(これまで示してきたような状況の場合)、条件を組み合わせる方法としてこれを使用することもできます。

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

これにより、socket.gethostnameの個別の呼び出しが不要になり、プロジェクトが拡大したり、追加のホストを承認する必要がある場合に、有効な値を簡単に追加できるようになります。

37
g.d.d.c

括弧は単に操作の順序を強制します。 「and」など、条件に追加の部分がある場合は、括弧を使用して、「and」と「and」のペアを示すことをお勧めします。

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

と区別するために

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

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

とはいえ、私がかつて見たガイドライン(おそらく実用的なCプログラミング)は次のようなことを言っていました。

  1. 乗算と除算を最初に
  2. 次の加算と減算
  3. 他のすべてを囲む括弧

(はい、IIRCはべき乗を省きました!)

優先順位ルールは非常に不可解であるため、コードを読んでいる元のプログラマーでも保守プログラマーでも、誰もそれらをすべて覚えておく必要はないという考えです。基本的に、括弧はコンパイラーに意図を伝えるためと、それに取り組む必要がある次のschmoeのドキュメントとしての役割を果たします。

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

9
kindall

Pythonおよび他の多くのプログラミング言語では、複数の演算子を含むすべての式に括弧は必要ありません。これは、演算子に定義済みの優先順位があるためです。表を参照してください here (セクション5.15)Pythonの演算子の優先順位に関する情報。

算術に類推できます。これらの式は同等です。

5 * 5 + 3

(5 * 5) + 3

最初に3つ追加する場合は、次のように括弧を使用する必要があります。

5 * (5 + 3)
2
James Thompson

マニュアル をご覧ください。リストの上位にいるほど、演算子は後で適用されます。 「または」は「==」の上にあるため、この特定のケースでは答えは同じです。ただし、読みやすくするために、また念のために、かっこをお勧めします。

0
jarondl