【Python 入門】0 からわかる OR, AND, NOT(論理演算子)

【Python 入門】0 からわかる OR, AND, NOT(論理演算子)

こんにちは!
株式会社キカガクで機械学習講師をしている篠原です!

担当:篠原
担当:篠原

苦手な人の気持ちに寄り添うことを忘れない」をモットーに、18 歳から集団指導塾や高校の学内予備校で教えていました!
この記事も、これから Python を学習する方向けに丁寧に書きましたので、ぜひご覧ください!

プログラミングを学んでいると出会うのが、「かつ」や「または」といった日本語、and or not といった英単語です。これらには英単語以上に意味が含まれており、ここを理解するとプログラミングの演算が得意になります!

ぜひ、この記事を通じて少しでも理解が深まれば幸いです。

本記事はこんな方にオススメです
  • Python を学び始めたけど、 かつ(and) や または(or) でつまづいてしまう
  • height < 50 and weight < 100 などと聞いてもいまいちピンとこない
  • そもそも、論理演算子ってなに?

論理演算子を理解するために

True と False とは?

論理演算子を知る上で、ここを理解できると定着がグッと捗ります!
少し遠回りになりますが紹介させてください!

Python を学ぶ上で、この値によく遭遇します。
これらの値は真偽値といい、正解→True / 不正解→False という認識で一般的に使われます。

簡単なコードで参考に

True の例
x=1 
y=2
x+y == 3
実行結果
True

x + yの値 と 3 を比較しています。
結果があっているので True を出力しました。

少しふざけて、こんな計算式もみてみましょう。(小学校 1 年生レベル!)

False の例
x=1 
y=2
x+y == 5

x + y の計算結果は5ですか?
・・・流石に違いますよね。

実行結果
False

結果が間違っているので False を出力しています。

このように、比較した結果があっていれば True を、間違っていれば False を受け取ります。

論理演算子とは?

ようやく本題です。論理演算子とはなんのことでしょうか?

一言で言うと「真偽( True / False )を判定するための演算子」です。

あなた

え、真偽の判定?それをして何になるの?

と思いますよね?(私は初めて学んだ時に疑問で仕方ありませんでした。)

初心者ポイント 真偽の判定

人間は状況状況に応じて臨機応変に脳を働かせますが、パソコンの世界ではそんなことはありません。
実は2進法という考え方で物事を処理しています。

1 と 0 の数を組み合わせて、解決しているのです。

2 値で表すのがこの世界の常識であり、「True / False」を返すのはこのためです。

パソコンの世界で計算するには、パソコンの世界の処理に合わせてあげます。

担当:篠原
担当:篠原

0 と 1の二値で考えます。郷に入れば郷に従いましょう!

さらにこの論理演算子には大きく 3 つの種類に分かれます。

  • 論理和 ( or )
  • 論理積 ( and )
  • 否定 ( not )

です。

ここまでの復習
  • 論理演算子を知るために・・・真偽値 ( True と False ) の理解が必要
  • 論理演算子とは、真偽値を判定するための演算子

次はそれぞれに注目して学んでいきましょう!

or と and と not それぞれの説明

or (論理和) または

日本語に置き換えた際、「または」でつながる条件を作成するときに、or(論理和) を使用します。

例えば学校のテストで先生が言う「今週の小テストで 30 点以上 または 期末試験で 65 点以上で合格です!」や
遊園地のお化け屋敷の案内に書いてある「身長120cm以下 または 年齢 12 歳以下 は 1 人でご利用になれません。」などです。

2 つの条件式のどちらかが True だった場合、True を返します。

例1 小テスト 41 点 期末試験 69 点 文句なし合格の優等生
Mini_test = 41
Test_score = 69

if (Mini_test >= 30) or (Test_score >= 65):
print('あなたは合格です!')

else:
print("残念ながら不合格です。")

この結果を表示させると・・・

例 1 の出力結果
出力:あなたは合格です!

優等生は合格と表示されました!

では、次の例はどう表示されるでしょうか。

例2 小テスト 20 点 期末試験 78 点 期末試験でギリ耐えた運動部スタイル
Mini_test = 20 
Test_score = 78

if (Mini_test >= 30) or (Test_score >= 65): 
  print('あなたは合格です!') 

else: 
  print("残念ながら不合格です。")
例 2 の出力結果
出力:あなたは合格です!

この生徒も合格と表示されました!

小テストは20点と届きませんでしたが、期末試験が65点以上 (78点) だったので合格です!

それでは、次の生徒はどうでしょうか。

例3 小テスト 37 点 期末試験 62 点 小テストを大事に勉強
Mini_test = 37
Test_score = 62

if (Mini_test >= 30) or (Test_score >= 65): 
  print('あなたは合格です!') 

else: 
  print("残念ながら不合格です。")

この結果を表示させると・・・

例 3 の出力結果
出力:あなたは合格です!

よかった。合格です!

小テストが合格点 (30点以上の 37点 ) だったので、期末試験が62点でしたが救われました。

それでは、最後、次の生徒はどうでしょうか。

例4 小テスト 12 点 期末試験 49 点 ゲームにハマり、勉強を放置。
Mini_test = 12
Test_score = 49

if (Mini_test >= 30) or (Test_score >= 65): 
  print('あなたは合格です!') 

else: 
  print("残念ながら不合格です。")

この結果を表示させると・・・

例 4 の出力結果
出力:残念ながら不合格です。

このように、いくつかの条件式のうち、1 つでも当てはまる (True) ならば True を返してくれる。
このような論理演算子が or 論理和 です。

学年に1人はいた優しいタイプの先生みたいですね! 

担当:篠原

and (論理積)かつ

日本語に置き換えた際、「かつ」でつながる条件を作成するときに、and (論理積)を使用します。

例えば

大学教授が言う単位取得条件の「授業へ 10 回以上の出席 かつ 最後の期末試験で 60 点以上 」などです。どちらかを満たさないと単位がもらえない、そんな状況を想像してみてください。(厳しい…)

2 つの条件式が 両方とも True だった場合のみ、True を返します。

コード例

例1 出席 10 回 テスト 100 点 文句なし合格君
Attend = 10
Test_score = 100

if (Attend >= 10) and (Test_score >= 60): 
 print('合格!') 

else: 
 print("単位は上げられません。")
例1の出力結果
出力:合格!

文句なしに合格と出力されましたね。

では、次の例です。

例2 出席 10 回 テスト 50 点 真面目に参加はしていたけど…
Attend = 10
Test_score = 50

if (Attend >= 10) and (Test_score >= 60): 
 print('合格!') 
else: 
 print("単位は上げられません。")
例 2 の出力結果
出力:単位は上げられません。

テストが 50 点だったため、残念ながら単位はもらえませんでした。

あくまでも、テスト 60 点以上 かつ 出席 10 回以上ですからね。

例 3 出席4回 テスト 100点 当日は点数取れる人
Attend = 4
Test_score = 100

if (Attend >= 10) and (Test_score >= 60): 
 print('合格!') 
else: 
 print("単位は上げられません。")
例3の出力結果
出力:単位は上げられません。

テストは100点でしたが、出席がたったの4回だったため、単位はもらえませんでした。

テストで点数が取れているのだから、単位くれてもいいじゃん…と思いますよね笑

このように、いくつかの条件式の全てが当てはまる( True )時のみ True を返す。
このような論理演算子が and論理和 です。

すごく厳しい条件を作りたいときにぴったりですね!!! 

担当:篠原

not (否定) でない

1つの条件式が False だった場合、True を返します。一番イメージ通りです。

True と False をそのまま反転するときに使用します。

お酒は20歳になってから飲めます。
age = 20
if not(age < 20) :
print('お酒を飲んでOKです!')

これは、20歳未満でなければ、お酒を飲んでもOKです。と出力するプログラムです。

例3の出力結果
出力:お酒を飲んでOKです!

真偽をひっくり返すんですね! 

担当:篠原

and, or, not の優先順位

算数や数学で 1 + 2 × 3 という計算式を見たとき、 1 + 2 よりも先に 2 × 3 を優先して計算しますよね。これと同じことが論理演算子にも起こります。優先順位はこのようになります。

not > and > or

そのため、3 つの論理演算子が複雑に組まれているときは、この順番で真偽を更新していく必要があります。

ではいきなりですが、次の真偽は True でしょうか。False でしょうか?考えてみましょう!

応用問題
次の場合、優先順位などを考慮すると、真偽 (True/False) はどちらになるだろうか。

1 True or False →

2 not False and True →

3 True or False and (not False) →

4 True or True and False →

答え・解説

考えるポイントは 2 つです。

論理演算子の混合問題のコツ
① 優先順位(not > and > or)通りの着眼点で考えられているか。

② or, and, not の性質をきちんと抑えられているか。

  • or は 優しい先生 (1つでも真(1) があれば、結果は真)
  • and は 厳しい先生 (2つとも真でないと、結果は真にならない)
  • not は 否定(ひっくり返す

それでは、解説を見ていきましょう!

応用問題 1
1 True or False → True

or は、どちらか片方でも True ならば True を返す優しい先生でしたね。

よって、True or False は True を出力します。

応用問題 2
2 not False and True → True

まず今回の優先は、not > and なので、まずは not が影響を与えます。

よって、 not False and TrueTrue and True となります。

さらに and は、両方とも True ならば True を返す厳しい先生のような振る舞いでしたね!出力は True です。

応用問題 3
3 True or False and (not False) →  True

今回もまずは not を優先しますので、

True or False and (not False)True or False and True となります。

次に、and > or より、後ろの and を処理しますので、

True or False and TrueTrue or False となります。

最後に、or片方でも True なら True を出力するので、答えは True となります。

応用問題 4
4 True or True and False → True

まずは後ろの and に着目し、True or True and FalseTrue or False となります。

この後は 3 番と同じで、出力結果は True です。

bool 型以外のオブジェクトに対する論理演算子

Python では論理演算子として andornot が提供されていますが、これらは真偽値(boolean)に対する操作を表すだけではなく、非 bool 型のオブジェクトに対しても使用することができます。これらの論理演算子が bool 型以外のオブジェクトに対してどのように働くかを見ていきましょう!

and演算子: and演算子は左から評価を始め、最初に False と評価される値を返します。もしすべての値が True と評価されるならば、最後の値を返します。つまり、非 bool 型の場合でも、Falseと評価される値(0、空文字、空リストなど)があればその値を返し、そうでなければ最後の値を返します。

and 演算子
print(1 and 0)  # 0
print(1 and 'hello')  # 'hello'
print('' and 'world')  # ''

or演算子: or演算子も左から評価を始め、最初に True と評価される値を返します。もしすべての値が False と評価されるならば、最後の値を返します。つまり、非 bool 型の場合でも、Trueと評価される値(0以外の数、空でない文字列やリストなど)があればその値を返し、そうでなければ最後の値を返します。

or 演算子
print(1 or 0)  # 1
print(0 or 'hello')  # 'hello'
print('' or 'world')  # 'world'

not演算子: not演算子は、単一のオブジェクトに対する演算子で、そのオブジェクトが False と評価される場合に True を、True と評価される場合に False を返します。

not 演算子
print(not 0)  # True
print(not '')  # True
print(not 'world')  # False

以上が、Python の論理演算子が bool 型以外のオブジェクトにどのように作用するかの基本的な説明です。これらの振る舞いは非常に有用で、コードの簡略化や可読性の向上に役立ちます!

補足:Falsy な値について

Python において、論理的に False と評価される値を”Falsy”な値とも呼びます。以下に Python で False と評価される主な値をリストアップします:

  • None: Python の None は何もないことを示す特別な値で、論理的には False になります。
  • ゼロ値: 数値型の 0 および 0.0False と評価されます。
  • 空のシーケンスまたはコレクション: 空の文字列("")、空のリスト([])、空のタプル(())、空の辞書({})、空のセット(set())などはすべて False と評価されます。
  • 空のカスタムクラスのインスタンス: カスタムクラスで __bool__() メソッドまたは __len__() メソッドが定義されており、それが False0 を返す場合、そのインスタンスは False と評価されます。
class MyCustomClass:
    def __len__(self):
        return 0

print(bool(MyCustomClass()))  # False

これら以外の値は、基本的には True と評価されます。これを “Truthy” な値と呼びます。例えば、空でない文字列やリスト、None 以外のオブジェクト、ゼロ以外の数値などがこれに該当します。

Python における False と評価される値について理解することは、論理演算子の挙動を理解し、効率的なコードを書く上で重要です。

最後に

今回は Python の論理演算子についてまとめました。

論理演算子をマスターするために
  • 真偽値とは何かをしっかり抑える
  • 3 つの論理演算子の性質を抑える
  • 優先順位を抑え、どの処理から行われるのかを理解する

論理演算子は、プログラミングを理解していく上で基礎中の基礎になりますので、苦手な方は何度も読み込んで復習してくださいね!
また、Python に苦手意識がある方は、この記事も併せてご覧ください。知識がより整理されますよ!



また、プログラミング初心者向けにこんな記事もご用意しています。是非ご覧ください!

これからも初学者目線でつまづくポイントをブログにて解説していきますので、他の記事もぜひご覧ください!
最後まで読んでいただきありがとうございました!

篠原

こちらの記事もオススメ

まずは無料で学びたい方・最速で学びたい方へ

まずは無料で学びたい方: Python&機械学習入門コースがおすすめ

Python&機械学習入門コース

AI・機械学習を学び始めるならまずはここから!経産省の Web サイトでも紹介されているわかりやすいと評判の Python&機械学習入門コースが無料で受けられます!
さらにステップアップした脱ブラックボックスコースや、IT パスポートをはじめとした資格取得を目指すコースもなんと無料です!

無料で学ぶ

最速で学びたい方:キカガクの長期コースがおすすめ

一生学び放題

続々と転職・キャリアアップに成功中!受講生ファーストのサポートが人気のポイントです!

AI・機械学習・データサイエンスといえばキカガク!
非常に需要が高まっている最先端スキルを「今のうちに」習得しませんか?

無料説明会を週 2 開催しています。毎月受講生の定員がございますので確認はお早めに!

説明会ではこんなことをお話します!
  • 国も企業も育成に力を入れている先端 IT 人材とは
  • キカガクの研修実績
  • 長期コースでの学び方、できるようになること
  • 料金・給付金について
  • 質疑応答