メインコンテンツへスキップ

2.1.3 演算子と式

演算子と条件分岐のフローチャート

この節の位置づけ

この節では、データに対して計算や判定を行う方法を学びます。演算子は数学計算だけでなく、モデル指標の計算、条件による絞り込み、ループの判定、データクレンジングのロジックにもよく使われます。変数を組み合わせてプログラムのロジックを作るための、最初の一歩です。

学習目標

  • 算術演算子、比較演算子、論理演算子を理解する
  • 演算子の優先順位を理解する
  • 代入演算子とメンバーシップ演算子の使い方を学ぶ
  • 正しい条件式を書けるようになる

何をしたいかよく使う演算子
数値を計算する+-*/
大きさを比べる>>===!=
条件を組み合わせるandornot
含まれているか判定するinnot in

まずは場面を見てみよう

AI のデータ処理スクリプトを開発しているとします。次のような処理が必要です。

  • モデルの正解率を計算する:correct / total * 100
  • 合格かどうかを判定する:accuracy >= 60
  • 2つの条件を確認する:accuracy >= 60 and loss < 0.5

これらの操作はすべて演算子なしではできません。演算子とは、Python に「データに対して何をするか」を伝える記号です。


算術演算子

いちばん基本的な数学演算です。

演算子意味結果
+足し算5 + 38
-引き算5 - 32
*掛け算5 * 315
/割り算5 / 31.6667
//切り捨て除算5 // 31
%余り5 % 32
**べき乗5 ** 3125

実際の例

# シーン:AI モデル学習のいくつかの指標を計算する

total_samples = 1000 # 総サンプル数
correct = 873 # 正しく予測できた数
epochs = 50 # 学習回数
batch_size = 32 # バッチサイズ

# 正解率を計算する
accuracy = correct / total_samples * 100
print(f"正解率: {accuracy}%") # 87.3%

# 1 epoch を終えるのに必要なバッチ数を計算する
batches_per_epoch = total_samples // batch_size
remaining = total_samples % batch_size

print(f"各 epoch の完全なバッチ数: {batches_per_epoch}") # 31
print(f"最後のバッチのサンプル数: {remaining}") # 8

# 指数減衰する学習率を計算する
initial_lr = 0.01
decay = 0.95
current_lr = initial_lr * (decay ** epochs)
print(f"{epochs} 回目の学習の学習率: {current_lr:.6f}") # 0.000769
この例に出てくる AI 学習用語
  • epoch(エポック、学習回数):学習データを最初から最後まで 1 回見ることです。1000 件のサンプルがあれば、1 epoch はモデルが 1000 件すべてを 1 回見たという意味です。
  • batch(バッチ):まとめて処理する小さなサンプルのかたまりです。batch_size = 32 は、モデルが全データを一度に見るのではなく、32 件ずつ見るという意味です。
  • learning rate / lr(学習率):モデルのパラメータを更新するときの一歩の大きさです。大きすぎると不安定になり、小さすぎると学習が遅くなります。
  • decay(減衰):値を少しずつ小さくすることです。学習が進むにつれて学習率を下げるときによく使います。

割り算の2つの形

ここは初心者がよく混乱するところです。

print(7 / 2)    # 3.5   ← 通常の割り算。結果は float
print(7 // 2) # 3 ← 切り捨て除算。小数部分を捨てる
print(-7 // 2) # -4 ← 注意!0 方向ではなく、下方向に切り捨てる

# 余りの使いどころ
print(10 % 3) # 1 ← 10 を 3 で割ると余りは 1
print(15 % 5) # 0 ← 割り切れると余りは 0

# 奇数・偶数の判定
number = 42
if number % 2 == 0:
print(f"{number} は偶数です") # 42 は偶数

比較演算子

比較演算子の結果は常に真偽値(True または False)です。

演算子意味結果
==等しい5 == 5True
!=等しくない5 != 3True
>より大きい5 > 3True
<より小さい5 < 3False
>=以上5 >= 5True
<=以下5 <= 3False
# シーン:モデルの性能を判定する
accuracy = 87.3
loss = 0.35

print(accuracy > 90) # False —— 正解率は 90 を超えていない
print(accuracy >= 80) # True —— 正解率は 80 以上ある
print(loss < 0.5) # True —— 損失値は 0.5 未満
print(accuracy == 87.3) # True —— 正解率はちょうど 87.3
よくある間違い: === の違い
  • =代入です:x = 5 は 5 を x に入れる
  • ==比較です:x == 5 は x が 5 と等しいかを判定する

初学者がいちばん間違えやすいのは、判定のときに == ではなく = と書いてしまうことです。

連鎖比較(Python 特有)

Python では連鎖比較ができます。これは他の言語ではできないことがあります。

age = 25

# age が 18 から 65 の間かを判定する
print(18 <= age <= 65) # True

# 同じ意味
print(18 <= age and age <= 65) # True。ただし上の書き方のほうが簡潔

# さらに例
x = 5
print(1 < x < 10) # True
print(1 < x < 3) # False

論理演算子

論理演算子は、複数の条件を組み合わせるために使います。

演算子意味説明
andかつ両方が真のときだけ真
orまたは少なくとも1つが真なら真
notではない反転する。真は偽に、偽は真になる
age = 25
has_id = True
has_ticket = False

# and: 2つの条件を両方満たす
can_enter = age >= 18 and has_id
print(f"入場できるか: {can_enter}") # True(年齢は足りていて、証明書もある)

# or: 少なくとも1つの条件を満たす
has_pass = has_id or has_ticket
print(f"通行証があるか: {has_pass}") # True(証明書があればよい)

# not: 反転する
is_minor = not (age >= 18)
print(f"未成年か: {is_minor}") # False

実際の例: AI モデル評価

accuracy = 92.5
loss = 0.15
training_time = 3.5 # 時間

# 良いモデルの条件: 正解率 > 90 かつ 損失 < 0.3
is_good_model = accuracy > 90 and loss < 0.3
print(f"良いモデルですか: {is_good_model}") # True

# 再学習が必要: 正解率が低すぎる、または 損失が高すぎる
need_retrain = accuracy < 80 or loss > 1.0
print(f"再学習が必要ですか: {need_retrain}") # False

# 実用的なモデル: 良いモデル かつ 学習時間が妥当
is_practical = is_good_model and not (training_time > 24)
print(f"実用的ですか: {is_practical}") # True

短絡評価

短絡評価の安全チェック図解

Python の andor には、短絡評価という賢い性質があります。

# and: 1つ目の条件が False なら、2つ目は確認しない
# 1つ目がすでに False なので、結果は必ず False
False and print("この文は実行されません")

# or: 1つ目の条件が True なら、2つ目は確認しない
# 1つ目がすでに True なので、結果は必ず True
True or print("この文も実行されません")

この性質は、実際のプログラミングで安全確認によく使います。

# 先にリストが空かどうかを確認してから要素にアクセスする(エラー防止)
data = []
# data が空なら len(data) > 0 は False なので、後ろは実行されない
if len(data) > 0 and data[0] > 10:
print("最初の要素は 10 より大きい")

代入演算子

基本の = 以外にも、短く書ける形があります。

演算子同じ意味
+=a = a + ba += 5
-=a = a - ba -= 3
*=a = a * ba *= 2
/=a = a / ba /= 4
//=a = a // ba //= 3
%=a = a % ba %= 2
**=a = a ** ba **= 3
score = 0

score += 10 # score = 0 + 10 = 10
score += 20 # score = 10 + 20 = 30
score -= 5 # score = 30 - 5 = 25
score *= 2 # score = 25 * 2 = 50

print(f"最終スコア: {score}") # 50

これらの短縮形は、ループで特によく使います。

# 1 から 100 までを足し合わせる
total = 0
for i in range(1, 101):
total += i
print(f"1 から 100 までの合計: {total}") # 5050

メンバーシップ演算子

innot in は、ある値が集合の中に含まれているかどうかを調べます。

# 文字列の中から探す
print("Python" in "I love Python") # True
print("Java" in "I love Python") # False
print("Java" not in "I love Python") # True

# リストの中から探す
fruits = ["りんご", "バナナ", "オレンジ"]
print("りんご" in fruits) # True
print("スイカ" in fruits) # False

# 実用例: ファイル拡張子を確認する
filename = "model.py"
if ".py" in filename:
print("これは Python ファイルです")

同一性演算子

isis not は、2つの変数が同じオブジェクトかどうかを調べます。値が同じかどうかではなく、メモリ上の同じものかどうかを見ます。

a = None

# None かどうかを確認する(== ではなく is を使うのが推奨)
print(a is None) # True
print(a is not None) # False

# is と == の違い
x = [1, 2, 3]
y = [1, 2, 3]
z = x

print(x == y) # True —— 値が同じ
print(x is y) # False —— 同じオブジェクトではない(別のリスト)
print(x is z) # True —— z は x を指しているので同じオブジェクト
いつ is を使う?

99% の場面では == で十分です。is は主に None との比較に使います。

  • 良い例: if x is None:
  • よくない例: if x == None:

演算子の優先順位

1つの式に複数の演算子があるとき、Python は優先順位の高いものから順に計算します。

優先順位(高→低)演算子
1(最高)** べき乗
2+x, -x 正負記号
3*, /, //, %
4+, -
5==, !=, >, <, >=, <=
6not
7and
8(最低)or
# 括弧なし
result = 2 + 3 * 4 # 先に掛け算、その後に足し算: 2 + 12 = 14
result = 2 ** 3 ** 2 # べき乗は右から左: 2 ** 9 = 512

# 括弧をつけるとわかりやすい(おすすめ)
result = (2 + 3) * 4 # 20
result = (2 ** 3) ** 2 # 64
実用的なアドバイス

優先順位がわからないときは、括弧をつけましょう! 括弧は計算順序を正しくするだけでなく、コードを読みやすくもします。括弧を多く書いたからといって、誰かに笑われることはありません。


総合例: BMI 計算機

今日学んだ演算子をまとめて使ってみましょう。

# BMI 計算機
name = "小明"
weight = 70 # kg
height = 1.75 # m

# BMI を計算する: 体重 / 身長の2乗
bmi = weight / height ** 2 # 先に height**2 を計算してから割り算する
print(f"{name} の BMI: {bmi:.1f}") # 22.9

# 体重の範囲を判定する
is_underweight = bmi < 18.5
is_normal = 18.5 <= bmi < 24
is_overweight = 24 <= bmi < 28
is_obese = bmi >= 28

print(f"低体重: {is_underweight}") # False
print(f"普通体重: {is_normal}") # True
print(f"過体重: {is_overweight}") # False
print(f"肥満: {is_obese}") # False

# 総合判定
is_healthy = is_normal and not is_underweight
print(f"健康: {is_healthy}") # True

手を動かしてみよう

練習 1: 成績ランクの判定

比較演算子と論理演算子を使って成績ランクを判定しましょう。

score = 85

is_excellent = score >= 90 # 優秀
is_good = score >= 80 and score < 90 # 良い
is_pass = score >= 60 and score < 80 # 合格
is_fail = score < 60 # 不合格

# 結果を表示する
print(f"点数: {score}")
print(f"優秀: {is_excellent}")
print(f"良い: {is_good}")
print(f"合格: {is_pass}")
print(f"不合格: {is_fail}")

score の値を変えて、いろいろな点数の結果を試してみましょう。

練習 2: うるう年の判定

うるう年のルール: 4 で割り切れるが 100 では割り切れない、または 400 で割り切れる。

year = 2024

# ヒント: % を使って割り切れるかを判定し、and、or で条件を組み合わせる
is_leap = ___ # この式を完成させる

print(f"{year} はうるう年ですか? {is_leap}")

練習 3: 三角形の判定

3辺で三角形を作れるか判定しましょう(どの2辺の和も他の1辺より大きい)。

a, b, c = 3, 4, 5

# 判定条件を完成させる
is_triangle = ___

print(f"辺の長さ {a}, {b}, {c} で三角形を作れますか? {is_triangle}")

まとめ

演算子の種類よく使う記号用途
算術+, -, *, /, //, %, **数学計算
比較==, !=, >, <, >=, <=条件判定、結果は True/False
論理and, or, not複数条件の組み合わせ
代入=, +=, -=, *= など変数に値を入れる
メンバーシップin, not in要素が集合に含まれるか調べる
同一性is, is not同じオブジェクトか調べる
核心の理解

演算子は、プログラミングの基本となる「動詞」です。変数やデータは「名詞」、演算子は「動詞」です。これらが組み合わさって「式」になります。つまり、コンピュータに何をさせたいかを伝えるのが式です。