論理演算子 パート4
CoddyのPythonジャーニー「基礎」セクションの一部。レッスン 19/77。
論理式を扱うとき、簡略化したり並べ替えたりする必要がある場合があります。これは、複数のand演算子とor演算子を組み合わせた複雑な条件を扱う際に特に便利です。
ド・モルガンの法則は、論理式を変換するための規則です。こうした変換により、コードがより読みやすく、理解しやすくなります。
第1法則: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段階のルールが当てはまります。各オペランドが否定され、演算子が反転します。今回は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 (経験がなく、かつ学位もないため不採用)# これはド・モルガンの法則を使って次のようにも書けます:
# accept = (経験 OR 学位) AND 年齢条件を満たす; reject = not accept
accept_application = (has_experience or has_degree) and meets_age
reject_application2 = not accept_application
print(reject_application2) # True(結果は同じだが、ロジックは異なる)ド・モルガンの法則を使う場面:
- 否定条件を読みやすくする
- 複雑な論理式を簡略化する
- 同じ論理を異なる表現に変換する
チャレンジ
初心者ペットショップが、顧客にペットを販売できるかどうかを判定するシステムを作るのを手伝っています。
次の変数を初期化してください:
has_licenseの値をTrueにするhas_spaceの値をTrueにするhas_experienceの値をFalseにする
次の条件を判定する論理式を書いてください:
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)このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Pythonオンラインコンパイラ