論理演算子 パート4
CoddyのPythonジャーニー「Fundamentals」セクションの一部。レッスン 19/77。
論理式を扱う際、時にはそれらを単純化したり再配置したりする必要があります。これは、複数の and や or 演算子を組み合わせた複雑な条件を扱う場合に特に役立ちます。
ド・モルガンの法則(De Morgan's Laws)は、論理式(logical expressions)を変換するためのルールを提供します。これらの変換により、コードの可読性が向上し、理解しやすくなります。
First Law: not (A and B) は (not A) or (not B) と同じです
式の中に not を展開(分配)するときに、2つのことが起こる点に注目してください。各オペランドが否定され(A は not A に、B は not B になる)、さらに演算子が反転します — and は or になります。not は単に値を否定するだけでなく、それらの間にある結合演算子も切り替えます。
例えば以下のようになります:
# 数値が1から10の間にないかどうかを確認しましょう
number = 15
# これら2つの式は同等です:
result1 = not (number >= 1 and number <= 10)
result2 = (not number >= 1) or (not number <= 10)
print(result1) # True
print(result2) # True第2の法則: not (A or B) は (not A) and (not B) と同じです。
ここでも同じ2ステップのルールが適用されます。each オペランドが否定され、演算子が反転します — 今回は or が and になります。not を展開すると、各部分を否定しながら常に and ↔ or が反転すると考えると分かりやすいでしょう。
例えば:
# 人が学生でも雇用されてもいないかどうかを確認する
is_student = False
is_employed = False
# これら2つの式は等価です:
result1 = not (is_student or is_employed)
result2 = (not is_student) and (not is_employed)
print(result1) # True
print(result2) # TrueANDとORの両方を含む複雑な例: 両方の演算子を組み合わせた条件が必要になる場合があります。実用的な例を以下に示します:
# 求人応募を受け付けられないかどうかを確認する
# 拒否する場合: (経験なし AND 学位なし) OR 年齢要件を満たさない
has_experience = False
has_degree = False
meets_age = True
# AND と OR の両方を使用した複雑な条件
reject_application = (not has_experience and not has_degree) or not meets_age
print(reject_application) # True (経験なし AND 学位なしのため却下)# これはド・モルガンの法則を使って書くこともできます:
# accept = (experience OR degree) AND meets age; reject = not accept
accept_application = (has_experience or has_degree) and meets_age
reject_application2 = not accept_application
print(reject_application2) # True(同じ結果、異なるロジック)ド・モルガンの法則を使用するタイミング:
- 否定の `conditions` をより読みやすくするため
- 複雑な論理式(`logical` `expressions`)を単純化するため
- 同じ `logic` の異なる表現間で相互に変換するため
チャレンジ
初心者ペットショップが顧客にペットを販売できるかどうかを判断するシステムの作成を手伝っています。
次の変数を初期化してください:
- 値
Trueのhas_license - 値
Trueのhas_space - 値
Falseのhas_experience
以下を判定するための論理式を記述してください:
can_sell_regular_pet: ライセンスまたは経験のいずれかがあり、かつスペースがある場合、顧客は通常のペットを購入できますcan_sell_exotic_pet: ライセンスと経験の両方があり、かつスペースがある場合、顧客はエキゾチックペットを購入できますcannot_sell_any_pet: ライセンスも経験もない、またはスペースがない場合、ショップはいかなるペットも販売できません
与えられた値での期待される結果:
can_sell_regular_pet:True(ライセンスとスペースがある)can_sell_exotic_pet:False(経験がない)cannot_sell_any_pet:False(ライセンスとスペースの両方がある)
自分で試してみよう
# 変数を初期化する
# 条件を計算する
# 以下の各プレースホルダー値を正しい論理式に置き換えてください
can_sell_regular_pet = False
can_sell_exotic_pet = False
cannot_sell_any_pet = False
# 以下の行を削除しないでください
print("Can sell regular pet:", can_sell_regular_pet)
print("Can sell exotic pet:", can_sell_exotic_pet)
print("Cannot sell any pet:", cannot_sell_any_pet)このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Fundamentalsのすべてのレッスン
自分で練習してみよう: Pythonオンラインコンパイラ