Python × 入門 | #08 論理演算を使おう

if文で分岐できるようになったので、次は条件を組み合わせてみましょう。Pythonでは andornot を使うと、複雑な条件を1つにまとめられます。

「80点以上かつ提出済みなら合格」のような実用的な判定が書けるようになります。今回は論理演算をPycoBlocksで確認します。

論理演算子(and・or・not)

まずはPycoBlocksを開こう

下のPycoBlocksで直接作業するか、別タブで開き、生成されるPythonコードを見ながら進めてください。今回は「条件」カテゴリのかつ / または / でないブロックを使います。

用語 意味
and(かつ) 両方が True のときだけ True になる論理演算子 x >= 0 and x <= 100
or(または) どちらか一方でも True なら True になる論理演算子 x < 0 or x > 100
not(でない) True と False を反転する論理演算子 not is_raining
短絡評価 and では左辺が False、or では左辺が True の時点で右辺の評価を省略する仕組み b != 0 and 10 / b

ステップ1:and(かつ)を使おう

and(かつ)は、2つの条件がどちらも True のときだけ True になります。「点数が80以上」かつ「課題を提出済み」の両方が揃ったときだけ合格、のような判定に使います。片方が False なら全体が False です。

ブロック例
x = int(input("点数を入力してください"))
submitted = True
if x >= 80 and submitted:
    print("PASS")

ステップ2:or(または)を使おう

or(または)は、どちらか一方でも True なら全体が True になります。「aが0 または bが0なら積が必ずゼロになる」のような「どちらかを満たせばよい」判定に使います。両方 False のときだけ False です。

ブロック例
a = int(input("aを入力"))
b = int(input("bを入力"))
if a == 0 or b == 0:
    print("どちらかが0")

ステップ3:not(でない)を使おう

not(でない)は条件を反転します。True を False に、False を True にします。「雨でないなら出発する」のように、否定の条件を書くときに使います。is_raining = FalseTrue に変えて実行し、表示が変わることを確認してみましょう。

ブロック例
is_raining = False
if not is_raining:
    print("出発")

コーディングモードで書いてみよう

論理演算を多用すると条件式が長くなります。高専の実習では、意味のかたまりごとに変数へ分けると読みやすくなります。

score = 85
submitted = True
score_ok = score >= 80
report_ok = submitted       # bool変数は == True を省略できる
if score_ok and report_ok:
    print("PASS")

式の意味が明確になるので、デバッグ時にどの条件が崩れているかも追いやすくなります。

短絡評価:右辺を評価しない場合がある

and は左辺が False の時点で右辺を評価しません。or は左辺が True の時点で右辺を評価しません。この性質を「短絡評価」といいます。ゼロ除算など危険な処理を避けるのに使えます。

b = 0
# b != 0 が False なので右辺の 10 / b は実行されない
print(b != 0 and 10 / b)   # False(ゼロ除算が起きない)

b = 2
print(b != 0 and 10 / b)   # 5.0

演習課題

課題8-1:入力した数が10以上100以下かどうか判定しよう

整数を入力し、10以上かつ100以下なら 範囲内です、そうでなければ 範囲外です と表示してください。and を使います。

▶ 模範解答と解説を見る

ブロックの組み合わせ例:

ブロック例
n = int(input("整数を入力してください"))
if n >= 10 and n <= 100:
    print("範囲内です")
else:
    print("範囲外です")

解説: and は両方の条件が True のときだけ全体が True になります。10 <= n <= 100 という書き方でも同じ意味になります(Pythonは数学的な範囲表記をそのまま使えます)。

課題8-2:範囲外かどうかを or で判定しよう

整数を入力し、0未満または100より大きいなら 範囲外、そうでなければ 範囲内 と表示してください。or を使います。

▶ 模範解答と解説を見る

ブロックの組み合わせ例:

ブロック例
n = int(input("整数を入力してください"))
if n < 0 or n > 100:
    print("範囲外")
else:
    print("範囲内")

解説: or はどちらか一方でも True なら全体が True になります。課題1の and による「範囲内判定」と、この or による「範囲外判定」は論理的に逆の条件です。not (n < 0 or n > 100) とすると課題1と同じ意味になります。

課題8-3:閏年を論理演算子で完全判定しよう

年号を入力し、閏年かどうかを判定してください。閏年の条件:「4の倍数 かつ 100の倍数ではない」または「400の倍数」。

▶ 模範解答と解説を見る

ブロックの組み合わせ例:

閏年を判定するブロック例
year = int(input("年号を入力してください"))
is_leap = (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0)
print(f"{year}年は閏年?:", is_leap)

解説: andornot を組み合わせた実用的な例です。2100年は4の倍数ですが100の倍数でもあるため閏年ではありません。2000年は400の倍数なので閏年です。実際に試してみましょう。なお、ブロック図では year % 4 == 0 など3つの条件をひとつの式に並べて組み立てているため、横に長くなっています。慣れないうちは中間変数(m4 = year % 4 == 0 など)に分けて書くと読みやすくなります。

課題8-4:短絡評価でゼロ除算を回避しよう

2つの整数 ab を入力し、b != 0 and a / b の短絡評価を使って、b が0でない場合のみ割り算を計算して表示してください。b が0のときは 0で割ることはできません と表示します。

▶ 模範解答と解説を見る

ブロックの組み合わせ例:

短絡評価で安全に割り算するブロック例
a = int(input("aを入力"))
b = int(input("bを入力(0を試してみよう)"))
# and の短絡評価:b != 0 が False なら右の a // b は実行されない
if b != 0 and a % b == 0:
    print(f"{a} は {b} の倍数です(割り切れます)")
elif b != 0:
    print(f"{a} ÷ {b} = {a / b:.2f}(割り切れません)")
else:
    print("0では割れません")

解説: and には短絡評価(ショートサーキット)という性質があります。b != 0 が False(b がゼロ)のとき、Python は右側の a % b を評価せずにスキップするためZeroDivisionError が起きません。b = 0 を入力して確認してみましょう。なお、ブロック図では :.2f の小数桁数指定をブロックで表せないため、割り算の結果をそのまま埋め込む形で示しています。実際の表示桁数は上のPythonコードで確認してください。

課題8-5:BMIを計算して肥満度を判定しよう

身長(m)と体重(kg)を入力し、BMIを計算して「低体重(BMI が 18.5 未満)」「普通体重(18.5 以上 25 未満)」「肥満(BMI が 25 以上)」を表示してください。and を使って範囲判定します。

▶ 模範解答と解説を見る

ブロックの組み合わせ例:

ブロック例
height = float(input("身長(m)を入力してください"))
weight = float(input("体重(kg)を入力してください"))
bmi = weight / (height ** 2)
if bmi < 18.5:
    print(f"BMI: {bmi:.1f} → 低体重")
elif bmi >= 18.5 and bmi < 25:
    print(f"BMI: {bmi:.1f} → 普通体重")
else:
    print(f"BMI: {bmi:.1f} → 肥満")

解説: bmi >= 18.5 and bmi < 25 で「18.5以上25未満」という範囲を判定しています。if-elif-else を組み合わせることで、連続する範囲を順番に確認できます。実際の肥満判定ではさらに細かい区分があります。

まとめ

  • and(かつ):両方が True のときだけ True ― 複数条件をすべて満たす判定に使う
  • or(または):どちらか一方が True なら True ― いずれかの条件を満たす判定に使う
  • not(でない):True ↔ False を反転 ― 「〜でないとき」を表すときに使う

次は、forループを使って同じ処理を自動化します。→ Python × 入門 | #09 forループで繰り返そう

PAGE TOP