19

演算子の優先順位に関する Python ドキュメントには、次のように記載されています。

同じボックス グループ内の演算子は、左から右にグループ化されます (テストを含む比較は例外で、すべて同じ優先順位を持ち、左から右にチェーンされます — セクション比較... を参照してください)。

これは何を意味するのでしょうか?具体的には:

  1. 「同じボックス内の演算子は左から右にグループ化されます (比較を除く...)」 -- 比較は左から右にグループ化されませんか?

  2. 比較が左から右にグループ化されない場合、代わりに何をしますか? それらは「グループ」ではなく「チェーン」ですか?

  3. 比較が「グループ」ではなく「チェーン」の場合、「チェーン」と「グループ」の違いは何ですか?

  4. 比較演算子が右から左ではなく左から右に連鎖していることを示す例は何ですか?

4

2 に答える 2

39

グループ化 (これは非比較演算子が行うことです):

a + b + c   means   (a + b) + c

連鎖 (これは比較演算子が行うことです):

a < b < c   means   (a < b) and (b < c)

左から右へのグループ化 (これは物事がグループ化される方法です):

5 - 2 - 1   means   (5 - 2) - 1 == 2

右から左にグループ化するのとは対照的に (これは異なる結果を生成します):

5 - (2 - 1) == 4

左から右への連鎖

チェーンは左から右に行われるため、a < b < cでは式a < bが の前に評価され、 が false のb < c場合は評価されません。a < bb < c

(2 < 1 < f())は false と評価されるためFalse、関数を呼び出さずに値を返します。そのため、2 番目の比較を実行する必要はありません。f2 < 1

f() > 1 > g()最初の比較を評価するために を呼び出しますf()。結果によっては、2 番目の条件を評価する必要がある場合とそうでない場合があります。これには を呼び出す必要がありg()ます。

注意。各オペランドは最大 1 回評価されます。したがって、式1 < f() < 2では、関数f()は 1 回だけ呼び出され、関数が与える値は両方の比較で使用されます (必要な場合)。

https://en.wikipedia.org/wiki/Short-circuit_evaluation

于 2014-09-09T21:02:23.883 に答える