Python講座 / 比較演算子と論理演算子で条件を組み合わせる
比較演算子は値の関係を調べ、論理演算子は条件を組み合わせます。ただしPythonのand・orはbool以外の値を返すこともあるため、真偽の判定と初期値の選択を区別して使います。
等値・代入・同一性を区別する
==は値の等しさ、=は代入、!=は等しくないことを表します。0 <= amount <= 10000のような比較は両端を含みます。数値と数字らしい文字列をそのまま大小比較できると考えず、入力の型を先に確認します。
Noneは値がないことを表し、通常はis Noneで調べます。isは同じオブジェクトか、==は等しい値かを調べる演算子です。別々に作った二つのリストは、中身が等しくても同じオブジェクトではありません。
論理式から分岐規則への流れは、if・elif・elseで処理を分岐すると条件分岐と反復で成績を集計するで扱う規則とつながります。
比較と初期値の式を動かす
conditions.pyへ全体コードを保存し、仮想環境でpython conditions.pyを実行します。真偽値だけでなくunknownと100が出る行にも注目します。
amount = 8000
category = "food"
print(0 < amount <= 10000)
print(amount > 5000 and category == "food")
print(not category)
print("" or "unknown")
print(0 or 100)
print([] == [], [] is [])
予想結果です。
True True False unknown 100 True False
真と見なされる値と短絡評価を理解する
空文字列、空のコレクション、0、Noneは条件で偽と扱われます。一方、"False"は空でない文字列なので真です。文字列の設定値をbool("False")で変換しても、Falseという意味にはなりません。
andは左側が偽なら右側を評価せず、orは左側が真なら右側を評価しません。この短絡評価では、選ばれたオペランドそのものを返せます。そのため"" or "unknown"はunknown、0 or 100は100になり、いつもTrueかFalseへ変わるわけではありません。
有効な0や空値を初期値で消さない
amount or 100は、amountが有効な0でも100を選びます。Noneだけを欠損と扱うなら100 if amount is None else amountと書きます。式を短くするためにデータの意味を変えてはいけません。
amountを10000と10001へ変えて上限を確かめ、categoryを空文字にしてnot categoryを比較します。観察後は元へ戻し、リストの中身の比較に==、値の不在の確認にis Noneを使う理由を説明してみましょう。
正の値で一度成功した条件でも、0、空コレクション、欠損項目では結果が違うことがあります。入力の変換と合わせて、どの状態を受け付けるのかを条件式より先に決めます。
短絡評価は右側の式を実行するかどうかにも影響します。False and check() と True or check() ではcheckは呼ばれません。print(False and print("called")) はFalseだけを表示します。必ず必要な検証や保存を、実行されない可能性のある右辺の副作用に任せないでください。




