コンピューターサイエンス入門:理論編
AND / OR の真理値表
この回でやること
ANDとORの真理値表を読み解き、検索結果と短絡評価の違いを確かめます。
- 読む 約 7 分
- 最後にクイズ 1 問
「かつ」と「または」で、検索の結果が変わる
検索でタグを2つ指定します。「かつ」なら両方のタグがある記事、「または」なら少なくとも片方がある記事を選びます。同じタグでも、つなぎ方で返る記事が変わります。
ANDは両方を要求し、ORは片方だけでも通します。たとえば「会員かつ招待あり」は会員でも招待がなければ通りません。「会員または招待あり」なら会員だけでも通ります。論理のORには、両方そろう場合も含まれます。
4通りを真理値表で読む
条件をaとbと呼び、それぞれ真か偽を取るとします。組み合わせは2 × 2 = 4通りです。すべての結果を並べた表を真理値表と呼びます。
| a | b | a AND b | a OR b |
|---|---|---|---|
| 偽 | 偽 | 偽 | 偽 |
| 偽 | 真 | 偽 | 真 |
| 真 | 偽 | 偽 | 真 |
| 真 | 真 | 真 | 真 |
ANDが真なのは1行、ORが偽なのは1行です。入力の順番を入れ替えても、この表の結果は変わりません。
Python
print(True and False) # False
print(False or True) # True
print(True or True) # TruePythonでは and と or、JavaScriptでは && と || と書きます。ここでは入力を真偽値に限定して読みます。
左で決まったら、右は見に行かない
Pythonの and は左が偽なら結果が決まり、右を評価しません。or は左が真なら右を評価しません。これが短絡評価です。
Python
user = None
print(user is not None and user.is_admin) # FalseNone はユーザーがいないことを表します。左の「ユーザーがいるか」が偽なので、右の管理者情報には触れません。逆の順番では、存在しないユーザーの情報を読もうとしてエラーになります。
現場の話 管理者かを確認する前に、ユーザーが存在するかを見る条件には順番の意味があります。真理値表が同じでも、途中で実行する処理まで同じとは限りません。
and と & は別物
第1章の & は整数をビットごとに比べました。Pythonの 2 & 3 は2です。一方、数を and に渡すと、真偽を判定して入力の値を返すため、2 and 3 は3になります。真偽値を返すとは限りません。
例題で確かめる
記事は10件あります。「Python」タグが6件、「入門」タグが5件で、両方ある記事は3件です。AND検索は両方ある3件です。OR検索は6 + 5 − 3 = 8件になります。重なった3件を二重に数えたので、1回分引きます。ORでも同じ記事を2回返すわけではありません。