if文で分岐できるようになったので、次は条件を組み合わせてみましょう。Pythonでは and・or・not を使うと、複雑な条件を1つにまとめられます。
「80点以上かつ提出済みなら合格」のような実用的な判定が書けるようになります。今回は論理演算をPycoBlocksで確認します。

まずは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 = False を True に変えて実行し、表示が変わることを確認してみましょう。

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)
解説: and・or・not を組み合わせた実用的な例です。2100年は4の倍数ですが100の倍数でもあるため閏年ではありません。2000年は400の倍数なので閏年です。実際に試してみましょう。なお、ブロック図では year % 4 == 0 など3つの条件をひとつの式に並べて組み立てているため、横に長くなっています。慣れないうちは中間変数(m4 = year % 4 == 0 など)に分けて書くと読みやすくなります。
課題8-4:短絡評価でゼロ除算を回避しよう
2つの整数 a と b を入力し、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ループで繰り返そう