Pythonでの論理ステートメントNOTAND&ORの優先度


82

私の知る限り、C&C ++では、NOT AND&ORの優先順位はNOT> AND> ORです。しかし、これはPythonでは同じようには機能しないようです。Pythonのドキュメントで検索しようとしましたが、失敗しました(少し焦っていると思います)。誰かが私のためにこれを片付けることができますか?


2
演算子の優先順位が思ったように機能しない例を挙げてください。
dodgethesteamroller 2013年

より大きく、より大きいかではない
CtrlAltF2

回答:


95

演算子の優先順位に関するドキュメントによると、最高から最低までではありません。

これが完全な優先順位テーブルで、最低優先順位から最高優先順位までです。行の優先順位は同じで、左から右にチェーンされます

 0. :=
 1. lambda
 2. ifelse
 3. or
 4. and
 5. not x
 6. in, not in, is, is not, <, <=, >, >=, !=, ==
 7. |
 8. ^
 9. &
 10. <<, >>
 11. +, -
 12. *, @, /, //, %
 13. +x, -x, ~x
 14. **
 14. await x
 15. x[index], x[index:index], x(arguments...), x.attribute
 16. (expressions...), [expressions...], {key: value...}, {expressions...}

1
**算術演算子よりも優先される場合は、脚注にいくつかの例外が記載されていることに注意してください。
MartijnPieters

1
これは私の数学者を混乱させます。算術では、算術演算子よりも優先されると言えます。右側では、**演算子は算術演算よりも優先されませんが、左側では...たとえば、5*2**2 == 5*(2**2)。しかし、それを言うのは正しいです2**-1 == 2**(-1)
PhilMacKay 2018

@ PhilMacKay-たとえば、マイナスはintリテラルの一部であるように見えるかもしれませんが、それを解析するときastはそうではありません-オペランドとしてのUnaryOpwithUSubおよび1asです。本当の理由は、それを解析する他の方法がないということです。つまり2**、バイナリマイナスの正しい左オペランドではありません。したがって、「べき乗優先度の例外」ですが、「右側のみ」です。
TomaszGandor19年

32

あなたはの優先度を把握するために、次の試験を行うことができますandし、or

まず、0 and 0 or 1Pythonコンソールで試してください

or最初にバインドする場合0、出力として期待されます。

私のコンソールで1は、が出力です。これはand、最初にバインドするか、等しいことを意味しますor(式は左から右に評価される可能性があります)。

次に、試してください1 or 0 and 0

組み込みの左から右への評価順序orand等しくバインドする場合、0出力として取得する必要があります。

私のコンソールで1は、が出力です。次に、それが。andよりも優先度が高いと結論付けることができorます。


3
:より明示的に、表現は次のように評価されている((0 and 0) or 1)(1 or (0 and 0))
Conchylicultor

1
ただし、2番目の式では、(0 and 0)がの(exp1 or exp2)場合、exp1が直接返されると評価されることはありませんTrue。同様に、最初の式では、がの場合、and 0パーツがexp1 and exp2直接返されるexp1と評価されることはありませんFalse
Conchylicultor


4

ブール演算子のうち、最も弱いものから最も強いものへの優先順位は次のとおりです。

  1. or
  2. and
  3. not x
  4. is not; not in

演算子の優先順位が等しい場合、評価は左から右に進みます。


申し訳ありませんが、#2は技術的には正しいですが、それでも非常に誤解を招く恐れがあります。まず第一に、ドキュメントは変更されていないようです。第二に、あなたの意見#2(提案andnot xは左から右に評価されます)は技術的に公式の効果と同等ですが、それは単に「cont2ではなくcond1」の場合、Pythonはデフォルトで最初にcont2を計算する必要があるためです。
RayLuo 2015

@RayLuoに感謝しますが、技術的にも正しくありませんでした。そのテーブルの行を分割する、正しくレンダリングされていない行に意味を置いていました。2.7ドキュメントを見てみると、今日 orand使って同じセルにあるように見えるFirefoxのではなく、オペラ。間の優先順位の違いorとはand明らかである(例えば 1 or 0 and 0(1 or 0) and 0)それとの間and及びnot xませんそんなにあなたが与える理由のために。ドキュメントの実際の内容を反映するように回答を修復します。
Oswald Wirt 2015

2

Pythonが、C / C ++を含む(ほぼ)他のすべてのプログラミング言語で確立されたもの以外に、これらの演算子の他の優先順位を持つ理由はありません

あなたにはそれを見つけることはPython言語リファレンスから演算子の優先順位、ダウンロード可能(現在のバージョンのため、他のすべての標準の文書でパック) - 、パート6.16 https://docs.python.org/3/download.html、またはそれを読みますオンラインはこちら:6.16。演算子の優先順位

しかし、まだあなたを誤解させることができ、Pythonで何かがある:結果andor事業者であってもよい異なるからTrueFalse-を参照して6.11ブール演算を同じ文書に。


1

いくつかの簡単な例。演算子の優先順位に注意してください(not、and、or)。人間の解釈可能性を支援するために括弧で囲みます。

a = 'apple'
b = 'banana'
c = 'carrots'

if c == 'carrots' and a == 'apple' and b == 'BELGIUM':
    print('True')
else:
    print('False')
# False

同様に:

if b == 'banana'
True

if c == 'CANADA' and a == 'apple'
False

if c == 'CANADA' or a == 'apple'
True

if c == 'carrots' and a == 'apple' or b == 'BELGIUM'
True

# Note this one, which might surprise you:
if c == 'CANADA' and a == 'apple' or b == 'banana'
True

# ... it is the same as:
if (c == 'CANADA' and a == 'apple') or b == 'banana':
True

if c == 'CANADA' and (a == 'apple' or b == 'banana'):
False

if c == 'CANADA' and a == 'apple' or b == 'BELGIUM'
False

if c == 'CANADA' or a == 'apple' and b == 'banana'
True

if c == 'CANADA' or (a == 'apple' and b == 'banana')
True

if (c == 'carrots' and a == 'apple') or b == 'BELGIUM'
True

if c == 'carrots' and (a == 'apple' or b == 'BELGIUM')
True

if a == 'apple' and b == 'banana' or c == 'CANADA'
True

if (a == 'apple' and b == 'banana') or c == 'CANADA'
True

if a == 'apple' and (b == 'banana' or c == 'CANADA')
True

if a == 'apple' and (b == 'banana' and c == 'CANADA')
False

if a == 'apple' or (b == 'banana' and c == 'CANADA')
True
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.