Pythonの基本的な演算子

2025-10-18

はじめに

前回の講義では変数とデータ型について学びました。今回は、それらのデータを操作するための「演算子」について詳しく学びます。

演算子は、プログラミングにおいてデータの計算や比較、操作を行うための記号です。Pythonには様々な種類の演算子があり、それぞれ特定の役割を持っています。

Pythonの演算子は主に以下のカテゴリに分類されます。

  1. 算術演算子
  2. 代入演算子
  3. 比較演算子
  4. 論理演算子
  5. アイデンティティ演算子
  6. メンバーシップ演算子
  7. ビット演算子

それぞれの演算子について、具体的に見ていきましょう。

1. 算術演算子

算術演算子は、数値の計算を行うための基本的な演算子です。
四則演算(加算、減算、乗算、除算)やそれ以外の数学的な計算を行うための記号です。
主な記号には、+(足し算)、-(引き算)、*(掛け算)、/(割り算)などがあります。

基本的な算術演算子

# 加算(足し算)
a = 10 + 5    # 結果: 15
print(f"10 + 5 = {a}")

# 減算(引き算)
b = 10 - 5    # 結果: 5
print(f"10 - 5 = {b}")

# 乗算(掛け算)
c = 10 * 5    # 結果: 50
print(f"10 * 5 = {c}")

# 除算(割り算)
d = 10 / 3    # 結果: 3.333...
print(f"10 / 3 = {d}")

# 切り捨て除算
e = 10 // 3   # 結果: 3
print(f"10 // 3 = {e}")

# 剰余(余り)
f = 10 % 3    # 結果: 1
print(f"10 % 3 = {f}")

# べき乗
g = 2 ** 3    # 結果: 8 (2の3乗)
print(f"2 ** 3 = {g}")

算術演算子の優先順位

数学と同じように、演算子には優先順位があります。
「関数呼び出し/後置演算子」→「単項演算子」→「乗算/除算/剰余」→「加算/減算」の順になります。
括弧(())はすべての演算子よりも優先されるため、計算の順序を明示的に指定できます。

# 優先順位の例
result1 = 2 + 3 * 4      # 3*4が先、結果: 14
result2 = (2 + 3) * 4    # 括弧内が先、結果: 20

print(f"2 + 3 * 4 = {result1}")
print(f"(2 + 3) * 4 = {result2}")

優先順位(高い順)

  1. ()(括弧)
  2. **(べき乗)
  3. *, /, //, %(乗算、除算、切り捨て除算、剰余)
  4. +, -(加算、減算)

2. 代入演算子

変数に値を代入するための演算子です。変数に値を代入するためのプログラミングの演算子です。
最も一般的なのは「=」で、右辺の値を左辺の変数に格納します。

基本的な代入演算子

# 基本代入
x = 10
print(f"x = {x}")

# 加算代入
x += 5    # x = x + 5 と同じ、結果: 15
print(f"x += 5 → x = {x}")

# 減算代入
x -= 3    # x = x - 3 と同じ、結果: 12
print(f"x -= 3 → x = {x}")

# 乗算代入
x *= 2    # x = x * 2 と同じ、結果: 24
print(f"x *= 2 → x = {x}")

# 除算代入
x /= 4    # x = x / 4 と同じ、結果: 6.0
print(f"x /= 4 → x = {x}")

# 切り捨て除算代入
x = 10
x //= 3   # x = x // 3 と同じ、結果: 3
print(f"x //= 3 → x = {x}")

# 剰余代入
x = 10
x %= 3    # x = x % 3 と同じ、結果: 1
print(f"x %= 3 → x = {x}")

# べき乗代入
x = 2
x **= 3   # x = x ** 3 と同じ、結果: 8
print(f"x **= 3 → x = {x}")

複合代入演算子の利点

「+=」や「-=」のように、他の算術演算子と組み合わせて計算結果を同じ変数に代入する複合代入演算子もあります。複合代入演算子を使うことで、コードが簡潔になり、処理が少し効率的になります。

# 従来の書き方
count = 10
count = count + 1

# 複合代入演算子を使った書き方
count = 10
count += 1

3. 比較演算子

2つの値や式を「等しい」「より大きい」などの関係で比較し、その結果が「真(true)」か「偽(false)」かを判定する記号です。

基本的な比較演算子

a = 10
b = 5

# 等しい
print(f"{a} == {b} : {a == b}")    # False

# 等しくない
print(f"{a} != {b} : {a != b}")    # True

# より大きい
print(f"{a} > {b} : {a > b}")      # True

# より小さい
print(f"{a} < {b} : {a < b}")      # False

# 以上
print(f"{a} >= {b} : {a >= b}")    # True

# 以下
print(f"{a} <= {b} : {a <= b}")    # False

文字列の比較

等号・不等号(== や != など)を用いて、文字列を比較して、それが等しいか、または文字の順番でどちらが先かなどを判定し、「真(True)」または「偽(False)」の真理値を返すものです。
=」は完全一致を、「>」は「より大きい」という辞書順の比較を行うものがあります。

# 文字列の比較も可能
name1 = "Alice"
name2 = "Bob"

print(f"'{name1}' == '{name2}' : {name1 == name2}")    # False
print(f"'{name1}' != '{name2}' : {name1 != name2}")    # True
print(f"'{name1}' < '{name2}' : {name1 < name2}")      # True(辞書順)

4. 論理演算子

複数の条件を組み合わせるための演算子です。
複数の条件式や論理値(trueまたはfalse)を組み合わせて、一つの真偽値を返すプログラミング言語の演算子です。代表的なものに「and(かつ)」、「or(または)」、「not(ではない)」があります。複雑な条件判定を簡潔に表現する際に利用されます。

基本的な論理演算子

x = 10
y = 5
z = 15

# and(論理積):両方がTrueの場合のみTrue
print(f"({x} > {y}) and ({x} < {z}) : {(x > y) and (x < z)}")    # True

# or(論理和):少なくとも一方がTrueの場合True
print(f"({x} < {y}) or ({x} < {z}) : {(x < y) or (x < z)}")      # True

# not(否定):TrueとFalseを反転
print(f"not ({x} > {y}) : {not (x > y)}")                        # False

論理演算子の実用例

次のコードは、ブーリアン演算(論理演算)を使った条件判定の例です。

  1. 年齢が18歳以上かつ免許を持っている場合に、can_driveTrue(運転可能)になります。
  2. 学生またはシニアであれば、discount_eligibleTrue(割引対象)になります。

つまり、andor を使って複数の条件を組み合わせ、論理的な判定を行っています。

# 年齢チェック
age = 20
has_license = True

# 運転可能かチェック
can_drive = (age >= 18) and has_license
print(f"年齢: {age}, 免許: {has_license} → 運転可能: {can_drive}")

# 割引適用条件
is_student = True
is_senior = False

# 学生またはシニアなら割引適用
discount_eligible = is_student or is_senior
print(f"割引対象: {discount_eligible}")

5. アイデンティティ演算子

オブジェクトが同じかどうかを判定する演算子です。、「is」と「is not」の二つがあります。

is  :左辺と右辺が全く同じオブジェクトを指している場合にTrueを返します。
is not :左辺と右辺が異なるオブジェクトを指している場合にTrueを返します。

# 同じ値だが別のオブジェクト
a = [1, 2, 3]
b = [1, 2, 3]
c = a

print(f"a is b : {a is b}")        # False(別オブジェクト)
print(f"a is c : {a is c}")        # True(同じオブジェクト)
print(f"a == b : {a == b}")        # True(値は同じ)

print(f"a is not b : {a is not b}") # True

is演算子と==演算子の違い

is演算子と==演算子は、どちらも比較を行うために使われますが、その比較対象が異なります。==演算子がオブジェクトの「値の等しさ(等価性)」を判定するのに対し、is演算子はオブジェクトが「同じ場所、つまりメモリ上の同一のオブジェクト(同一性)」を指しているかを判定します。

# 数値の場合(小さい整数は同じオブジェクトになることがある)
x = 10
y = 10
print(f"x is y : {x is y}")        # True(Pythonの最適化)
print(f"x == y : {x == y}")        # True

# 文字列の場合
str1 = "hello"
str2 = "hello"
print(f"str1 is str2 : {str1 is str2}")    # True(Pythonの最適化)

6. メンバーシップ演算子

特定の要素が、リスト、タプル、文字列、辞書などのシーケンス(集合的なデータ型)に含まれているかどうかを判定するための演算子です。主に in と not in の2つがあり、ブール値(True または False)を返します。

# リストでの使用
fruits = ["apple", "banana", "orange"]
print(f"'apple' in fruits : {'apple' in fruits}")        # True
print(f"'grape' in fruits : {'grape' in fruits}")        # False
print(f"'apple' not in fruits : {'apple' not in fruits}") # False

# 文字列での使用
text = "Hello, World!"
print(f"'Hello' in text : {'Hello' in text}")            # True
print(f"'Python' in text : {'Python' in text}")          # False

7. ビット演算子

ビット演算子とは、数値をコンピュータが扱う最小単位である「ビット(0と1)」のレベルで操作するための演算子です。通常の算術演算子(+や-など)が数値を全体として扱うのに対し、ビット演算子は数値の2進数表現の各ビットに対して個別の操作を行います。

a = 10  # 2進数: 1010
b = 4   # 2進数: 0100

# ビットAND
print(f"{a} & {b} = {a & b}")      # 0 (0000)

# ビットOR
print(f"{a} | {b} = {a | b}")      # 14 (1110)

# ビットXOR
print(f"{a} ^ {b} = {a ^ b}")      # 14 (1110)

# ビットNOT
print(f"~{a} = {~a}")              # -11

# 左シフト
print(f"{a} << 1 = {a << 1}")      # 20 (10100)

# 右シフト
print(f"{a} >> 1 = {a >> 1}")      # 5 (0101)

演算子の優先順位まとめ

複数の演算子を組み合わせる場合、以下の優先順位に従って評価されます。

# 優先順位の例
result = 5 + 3 * 2 ** 2 > 10 and 4 < 6
# 計算順序:
# 1. 2 ** 2 = 4
# 2. 3 * 4 = 12
# 3. 5 + 12 = 17
# 4. 17 > 10 = True
# 5. 4 < 6 = True
# 6. True and True = True

print(f"結果: {result}")  # True

主な演算子の優先順位(高い順)

  1. ()(括弧)
  2. **(べき乗)
  3. ~, +, -(ビットNOT、単項プラス・マイナス)
  4. *, /, //, %(乗除算)
  5. +, -(加減算)
  6. <<, >>(ビットシフト)
  7. &(ビットAND)
  8. ^(ビットXOR)
  9. |(ビットOR)
  10. ==, !=, >, >=, <, <=(比較)
  11. is, is not, in, not in(アイデンティティ、メンバーシップ)
  12. not(論理NOT)
  13. and(論理AND)
  14. or(論理OR)

まとめ

この講義では、Pythonの基本的な演算子について学びました。

  1. 算術演算子:数値計算を行う(+, -, *, /, //, %, **
  2. 代入演算子:変数に値を代入する(=, +=, -=, *=, /=, etc.)
  3. 比較演算子:値を比較する(==, !=, >, <, >=, <=
  4. 論理演算子:条件を組み合わせる(and, or, not
  5. アイデンティティ演算子:オブジェクトの同一性をチェック(is, is not
  6. メンバーシップ演算子:要素の包含をチェック(in, not in
  7. ビット演算子:ビットレベルでの操作(&, |, ^, ~, <<, >>

演算子はプログラミングの基本的な構成要素であり、これらを組み合わせることで複雑な計算や条件判断を行うことができます。演算子の優先順位を理解し、必要に応じて括弧を使用することで、意図した通りの計算を行うことが重要です。

次の講義では、これらの演算子を使って条件分岐(if文)を学びます。演算子の理解が深まっていると、条件分岐の学習がスムーズに進みます。


練習問題

初級問題(3問)

問題1
以下の計算の結果を予想し、実際にPythonで確認してください。

result1 = 15 + 3 * 2
result2 = (15 + 3) * 2
result3 = 20 / 4 + 1

問題2
変数xに10を代入し、以下の複合代入演算子を使用した後のxの値を追跡してください。

x = 10
x += 5
x *= 2
x -= 8
x //= 3

問題3
2つの数値a=15, b=7に対して、すべての比較演算子(==, !=, >, <, >=, <=)を使用した結果を表示するプログラムを作成してください。

中級問題(6問)

問題4
ユーザーから3つの数値を入力させ、それらの平均値を計算して表示するプログラムを作成してください。

問題5
与えられた年齢に基づいて以下の条件でメッセージを表示するプログラムを作成してください。

  • 18歳未満: "未成年です"
  • 18歳以上65歳未満: "成人です"
  • 65歳以上: "高齢者です"

問題6
与えられた文字列が特定のキーワードを含んでいるかチェックするプログラムを作成してください。含まれている場合は「キーワードが見つかりました」、含まれていない場合は「キーワードが見つかりません」と表示してください。

問題7
以下の条件をすべて満たすかどうかをチェックするプログラムを作成してください。

  • 年齢が20歳以上
  • 年収が300万円以上
  • 免許を持っている
    すべての条件を満たす場合は「条件を満たしています」、そうでない場合は「条件を満たしていません」と表示してください。

問題8
与えられた数値が偶数か奇数かを判定するプログラムを作成してください。剰余演算子(%)を使用してください。

問題9
3つの数値a, b, cを受け取り、それらが三角形の辺として成立するかどうかを判定するプログラムを作成してください。(三角形の成立条件:任意の2辺の和が残りの1辺より大きい)

上級問題(3問)

問題10
与えられた数値のビットパターンを表示し、その数値を1ビット左シフト、1ビット右シフトした結果とそのビットパターンを表示するプログラムを作成してください。

問題11
与えられた数値が素数かどうかを判定するプログラムを作成してください。素数とは1と自分自身以外で割り切れない数です(1は素数ではありません)。

問題12
シーザー暗号と呼ばれる暗号化プログラムを作成してください。文字を3文字分ずらす簡単な暗号化です(例:'A'→'D', 'Z'→'C')。大文字・小文字は区別し、アルファベット以外の文字はそのままにしてください。

練習問題 解答

初級問題 解答

問題1 解答

result1 = 15 + 3 * 2
result2 = (15 + 3) * 2
result3 = 20 / 4 + 1

print(f"15 + 3 * 2 = {result1}")      # 乗算が先
print(f"(15 + 3) * 2 = {result2}")    # 括弧内が先
print(f"20 / 4 + 1 = {result3}")      # 除算が先

実行結果:

15 + 3 * 2 = 21 (15 + 3) * 2 = 36 20 / 4 + 1 = 6.0

解説:

  • result1: 乗算が加算より優先されるため 3 * 2 = 615 + 6 = 21
  • result2: 括弧内が優先されるため 15 + 3 = 1818 * 2 = 36
  • result3: 除算が加算より優先されるため 20 / 4 = 5.05.0 + 1 = 6.0

問題2 解答

x = 10
print(f"初期値: x = {x}")

x += 5
print(f"x += 5 → x = {x}")

x *= 2
print(f"x *= 2 → x = {x}")

x -= 8
print(f"x -= 8 → x = {x}")

x //= 3
print(f"x //= 3 → x = {x}")

実行結果:

初期値: x = 10
x += 5 → x = 15
x *= 2 → x = 30
x -= 8 → x = 22
x //= 3 → x = 7

計算過程:

  1. x = 10
  2. x = 10 + 5 = 15
  3. x = 15 * 2 = 30
  4. x = 30 - 8 = 22
  5. x = 22 // 3 = 7(切り捨て除算)

問題3 解答

a = 15
b = 7

print(f"{a} == {b} : {a == b}")
print(f"{a} != {b} : {a != b}")
print(f"{a} > {b} : {a > b}")
print(f"{a} < {b} : {a < b}")
print(f"{a} >= {b} : {a >= b}")
print(f"{a} <= {b} : {a <= b}")

実行結果:

15 == 7 : False
15 != 7 : True
15 > 7 : True
15 < 7 : False
15 >= 7 : True
15 <= 7 : False

中級問題 解答

問題4 解答

# ユーザーから3つの数値を入力
num1 = float(input("1つ目の数値を入力してください: "))
num2 = float(input("2つ目の数値を入力してください: "))
num3 = float(input("3つ目の数値を入力してください: "))

# 平均値を計算
average = (num1 + num2 + num3) / 3

# 結果を表示
print(f"3つの数値の平均値: {average:.2f}")

実行例:

1つ目の数値を入力してください: 10
2つ目の数値を入力してください: 20
3つ目の数値を入力してください: 30
3つの数値の平均値: 20.00

問題5 解答

# 年齢を入力
age = int(input("年齢を入力してください: "))

# 条件分岐
if age < 18:
    print("未成年です")
elif age < 65:
    print("成人です")
else:
    print("高齢者です")

別解(論理演算子使用):

age = int(input("年齢を入力してください: "))

if age >= 65:
    print("高齢者です")
elif age >= 18:
    print("成人です")
else:
    print("未成年です")

実行例:

年齢を入力してください: 25
成人です

問題6 解答

# 文字列とキーワードを設定
text = "Pythonはプログラミング言語です"
keyword = "プログラミング"

# キーワードチェック
if keyword in text:
    print("キーワードが見つかりました")
else:
    print("キーワードが見つかりません")

ユーザー入力版:

text = input("文字列を入力してください: ")
keyword = input("検索するキーワードを入力してください: ")

if keyword in text:
    print("キーワードが見つかりました")
else:
    print("キーワードが見つかりません")

実行例:

文字列を入力してください: Pythonは面白いです
検索するキーワードを入力してください: 面白い
キーワードが見つかりました

問題7 解答

# ユーザー情報を入力
age = int(input("年齢を入力してください: "))
income = int(input("年収を入力してください(万円): "))
has_license = input("免許を持っていますか? (yes/no): ").lower() == "yes"

# 条件チェック
condition1 = age >= 20
condition2 = income >= 300
condition3 = has_license

# すべての条件を満たすかチェック
if condition1 and condition2 and condition3:
    print("条件を満たしています")
else:
    print("条件を満たしていません")

# 詳細なチェック結果を表示
print(f"\n詳細チェック:")
print(f"年齢20歳以上: {'○' if condition1 else '×'}")
print(f"年収300万円以上: {'○' if condition2 else '×'}")
print(f"免許所持: {'○' if condition3 else '×'}")

実行例:

年齢を入力してください: 25
年収を入力してください(万円): 400
免許を持っていますか? (yes/no): yes
条件を満たしています

詳細チェック:
年齢20歳以上: ○
年収300万円以上: ○
免許所持: ○

問題8 解答

# 数値を入力
number = int(input("数値を入力してください: "))

# 偶数か奇数かを判定
if number % 2 == 0:
    print(f"{number} は偶数です")
else:
    print(f"{number} は奇数です")

発展版(0と負の数も考慮):

number = int(input("数値を入力してください: "))

if number == 0:
    print("0です")
elif number % 2 == 0:
    print(f"{number} は偶数です")
else:
    print(f"{number} は奇数です")

実行例:

数値を入力してください: 7
7 は奇数です

問題9 解答

# 3辺の長さを入力
a = float(input("辺aの長さを入力してください: "))
b = float(input("辺bの長さを入力してください: "))
c = float(input("辺cの長さを入力してください: "))

# 三角形の成立条件をチェック
condition1 = (a + b) > c
condition2 = (a + c) > b
condition3 = (b + c) > a

# すべての条件を満たすか判定
if condition1 and condition2 and condition3:
    print("これらの辺で三角形を作ることができます")
else:
    print("これらの辺では三角形を作ることができません")

# 詳細なチェック結果
print(f"\n詳細チェック:")
print(f"({a} + {b}) > {c} : {condition1}")
print(f"({a} + {c}) > {b} : {condition2}")
print(f"({b} + {c}) > {a} : {condition3}")

実行例:

辺aの長さを入力してください: 3
辺bの長さを入力してください: 4
辺cの長さを入力してください: 5
これらの辺で三角形を作ることができます

詳細チェック:
(3.0 + 4.0) > 5.0 : True
(3.0 + 5.0) > 4.0 : True
(4.0 + 5.0) > 3.0 : True

上級問題 解答

問題10 解答

def print_binary(number, description):
    """数値とそのバイナリ表現を表示"""
    binary = bin(number)
    print(f"{description}: {number} (10進数) = {binary} (2進数)")

# 元の数値
original = 10
print_binary(original, "元の数値")

# 左シフト
left_shift = original << 1
print_binary(left_shift, "左シフト(<< 1)")

# 右シフト
right_shift = original >> 1
print_binary(right_shift, "右シフト(>> 1)")

# 追加: さまざまなシフト
print("\n--- 追加シフト操作 ---")
print_binary(original << 2, "左シフト(<< 2)")
print_binary(original >> 2, "右シフト(>> 2)")

実行結果:

元の数値: 10 (10進数) = 0b1010 (2進数)
左シフト(<< 1): 20 (10進数) = 0b10100 (2進数)
右シフト(>> 1): 5 (10進数) = 0b101 (2進数)

--- 追加シフト操作 ---
左シフト(<< 2): 40 (10進数) = 0b101000 (2進数)
右シフト(>> 2): 2 (10進数) = 0b10 (2進数)

問題11 解答

def is_prime(number):
    """素数かどうかを判定する関数"""
    if number <= 1:
        return False
    if number == 2:
        return True
    if number % 2 == 0:
        return False

    # 3から√numberまでの奇数で割り切れるかチェック
    for i in range(3, int(number**0.5) + 1, 2):
        if number % i == 0:
            return False
    return True

# ユーザー入力
num = int(input("数値を入力してください: "))

# 素数判定
if is_prime(num):
    print(f"{num} は素数です")
else:
    print(f"{num} は素数ではありません")

# 追加: 範囲内の素数を表示
print(f"\n--- {num}までの素数 ---")
primes = [i for i in range(2, num + 1) if is_prime(i)]
print(primes)

実行例:

数値を入力してください: 29
29 は素数です

--- 29までの素数 ---
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

問題12 解答

def caesar_cipher(text, shift=3):
    """シーザー暗号でテキストを暗号化"""
    result = ""

    for char in text:
        if char.isupper():
            # 大文字の処理
            result += chr((ord(char) - ord('A') + shift) % 26 + ord('A'))
        elif char.islower():
            # 小文字の処理
            result += chr((ord(char) - ord('a') + shift) % 26 + ord('a'))
        else:
            # アルファベット以外はそのまま
            result += char

    return result

def caesar_decipher(text, shift=3):
    """シーザー暗号を復号"""
    return caesar_cipher(text, -shift)

# メインプログラム
original_text = input("暗号化するテキストを入力してください: ")

# 暗号化
encrypted = caesar_cipher(original_text)
print(f"暗号化: {encrypted}")

# 復号
decrypted = caesar_decipher(encrypted)
print(f"復号: {decrypted}")

# 検証
print(f"元のテキストと一致: {original_text == decrypted}")

実行例:

暗号化するテキストを入力してください: Hello, World!
暗号化: Khoor, Zruog!
復号: Hello, World!
元のテキストと一致: True

発展版(シフト数を指定可能):

def caesar_cipher_advanced(text, shift):
    """シフト数を指定できるシーザー暗号"""
    result = ""

    for char in text:
        if char.isupper():
            result += chr((ord(char) - ord('A') + shift) % 26 + ord('A'))
        elif char.islower():
            result += chr((ord(char) - ord('a') + shift) % 26 + ord('a'))
        else:
            result += char

    return result

# ユーザー入力
text = input("テキストを入力してください: ")
shift = int(input("シフト数を入力してください: "))

# 暗号化と復号
encrypted = caesar_cipher_advanced(text, shift)
decrypted = caesar_cipher_advanced(encrypted, -shift)

print(f"暗号化: {encrypted}")
print(f"復号: {decrypted}")