Python の演算子を理解する

PythonBeginner
オンラインで実践に進む

はじめに

この実験(Lab)では、効果的なコードを作成するための基礎となる、Python における様々な演算子について包括的に理解を深めます。算術演算子、比較演算子、代入演算子、論理演算子、ビット演算子、メンバーシップ演算子、およびアイデンティティ演算子の使用法を探求し、実践します。

統合された VS Code エディタとターミナルを使用した実践的な演習を通じて、計算の実行方法、比較の実行方法、値の代入方法、条件の組み合わせ方、ビットの操作方法、メンバーシップの確認方法、およびオブジェクトの同一性の比較方法を学びます。この実験の終わりまでに、これらの演算子を効果的に使用して、より複雑で機能的な Python プログラムを構築できるようになるでしょう。

算術演算子と比較演算子の探求

このステップでは、Python における基本的な算術演算子と比較演算子を探求します。これらの演算子は、プログラム内で計算を実行したり、意思決定を行ったりするために不可欠です。実験(Lab)環境では、すでに~/projectディレクトリ内にoperators.pyというファイルが作成されています。

まず、VS Code エディタの左側にあるファイルエクスプローラーでoperators.pyファイルを見つけて開きます。すべてのコードはこの単一のファイルに記述します。

算術演算子から始めましょう。以下の Python コードをoperators.pyファイルに追加してください。

## Arithmetic Operators
a = 21
b = 5
print(f'{a} + {b} = {a + b}')
print(f'{a} - {b} = {a - b}')
print(f'{a} * {b} = {a * b}')
print(f'{a} / {b} = {a / b}') ## 標準除算 (Standard division)
print(f'{a} // {b} = {a // b}')  ## 切り捨て除算 (Floor division)、最も近い整数に切り捨て
print(f'{a} % {b} = {a % b}')  ## 剰余 (Modulo)、余りを返します
print(f'{a} ** {b} = {a ** b}')  ## べき乗 (Exponentiation)、b 乗の a

コードを追加した後、Ctrl + Sを押してファイルを保存します。

スクリプトを実行するには、上部メニューからTerminal > New Terminalを選択して、VS Code で統合ターミナルを開きます。次に、次のコマンドを実行します。

python ~/project/operators.py

ターミナルには、次の出力が表示されるはずです。

21 + 5 = 26
21 - 5 = 16
21 * 5 = 105
21 / 5 = 4.2
21 // 5 = 4
21 % 5 = 1
21 ** 5 = 4084101

次に、比較演算子を探求しましょう。これらの演算子は 2 つの値を比較し、ブール値(TrueまたはFalse)を返します。

以下のコードをoperators.pyファイルの末尾に追加します。

## Comparison Operators
print("\n--- Comparison Operators ---")
a = 6
b = 5
print(f'{a} == {b} is {a == b}')  ## 等しい (Equal to)
print(f'{a} != {b} is {a != b}')  ## 等しくない (Not equal to)
print(f'{a} > {b} is {a > b}')    ## より大きい (Greater than)
print(f'{a} < {b} is {a < b}')    ## より小さい (Less than)
print(f'{a} >= {b} is {a >= b}')  ## 以上 (Greater than or equal to)
print(f'{a} <= {b} is {a <= b}')  ## 以下 (Less than or equal to)

ファイルを再度保存し、ターミナルから実行します。

python ~/project/operators.py

出力には、比較操作の結果が含まれるようになります。

21 + 5 = 26
21 - 5 = 16
21 * 5 = 105
21 / 5 = 4.2
21 // 5 = 4
21 % 5 = 1
21 ** 5 = 4084101

--- Comparison Operators ---
6 == 5 is False
6 != 5 is True
6 > 5 is True
6 < 5 is False
6 >= 5 is True
6 <= 5 is False

これで、Python スクリプトで算術演算子と比較演算子を正常に使用できました。

代入演算子と論理演算子の練習

このステップでは、代入演算子と論理演算子の使用を練習します。代入演算子は変数の値を代入または更新するために使用され、論理演算子は条件文を組み合わせるために使用されます。

引き続き、VS Code エディタでoperators.pyファイルを使用します。

まず、代入演算子の例を追加しましょう。これらは、操作を実行し、その結果を同じ変数に再代入するための短縮形を提供します。

以下のコードをoperators.pyファイルの末尾に追加してください。

## Assignment Operators
print("\n--- Assignment Operators ---")
a = 10
b = 3
print(f'Initial a: {a}')

c = a
c += b  ## c = c + b と同等
print(f'a += b: {c}')

c = a
c -= b  ## c = c - b と同等
print(f'a -= b: {c}')

c = a
c *= b  ## c = c * b と同等
print(f'a *= b: {c}')

c = a
c /= b  ## c = c / b と同等
print(f'a /= b: {c}')

## Walrus operator (Python 3.8 以降)
## より大きな式の一部として変数に値を代入します。
print("\n--- Walrus Operator ---")
text = 'hello python'
if (n := len(text)) > 10:
    print(f'The string is long enough ({n} characters)')

ファイルを保存し、ターミナルから実行します。

python ~/project/operators.py

代入演算子の出力が表示されるはずです。

... (前ステップからの出力) ...

--- Assignment Operators ---
Initial a: 10
a += b: 13
a -= b: 7
a *= b: 30
a /= b: 3.3333333333333335

--- Walrus Operator ---
The string is long enough (12 characters)

次に、論理演算子(andornot)の例を追加しましょう。これらの演算子はブール値で動作しますが、他の型でも機能します。Python では、0None、空のコレクション(''[]{})などの値はFalseと見なされます。それ以外のすべての値はTrueと見なされます。

以下のコードをoperators.pyファイルの末尾に追加してください。

## Logical Operators
print("\n--- Logical Operators ---")
x = True
y = False

print(f'{x} and {y} is {x and y}')
print(f'{x} or {y} is {x or y}')
print(f'not {x} is {not x}')

## 非ブール値での評価
a = 10  ## True
b = 0   ## False
print(f'{a} and {b} returns {a and b}') ## 最初の Falsey 値、または最後の Truthy 値を返します
print(f'{a} or {b} returns {a or b}')   ## 最初の Truthy 値、または最後の Falsey 値を返します

ファイルを保存し、再度実行します。

python ~/project/operators.py

出力には、論理演算の結果が含まれるようになります。

... (以前の例からの出力) ...

--- Logical Operators ---
True and False is False
True or False is True
not True is False
10 and 0 returns 0
10 or 0 returns 10

これで、Python で代入演算子と論理演算子を使用する練習ができました。

ビット演算子を学ぶ

このステップでは、ビット演算子について学習します。これらの演算子は、整数のバイナリ(2 進数)表現に対して直接操作を実行します。これは、低レベルのデータ操作に役立ちます。

引き続きoperators.pyファイルを編集します。

まず、bin()関数を使用して、いくつかの数値のバイナリ表現を見てみましょう。0bプレフィックスは、それに続く数字がバイナリであることを示します。

以下のコードをoperators.pyの末尾に追加します。

## Bitwise Operators
print("\n--- Bitwise Operators ---")
a = 5  ## Binary: 0b101
b = 9  ## Binary: 0b1001
print(f'Binary of {a} is {bin(a)}')
print(f'Binary of {b} is {bin(b)}')

## 分かりやすくするために、4 ビットで揃えます:
## a = 0101
## b = 1001

## ビット単位 AND (&): 両方のビットが 1 の場合に、対応するビットを 1 に設定します。
## 0101 & 1001 = 0001 (10 進数 1)
print(f'{a} & {b} = {a & b}')

## ビット単位 OR (|): 2 つのビットのいずれかが 1 の場合に、対応するビットを 1 に設定します。
## 0101 | 1001 = 1101 (10 進数 13)
print(f'{a} | {b} = {a | b}')

## ビット単位 XOR (^): 2 つのビットのどちらか一方のみが 1 の場合に、対応するビットを 1 に設定します。
## 0101 ^ 1001 = 1100 (10 進数 12)
print(f'{a} ^ {b} = {a ^ b}')

## ビット単位 NOT (~): すべてのビットを反転させます。
## ~a は -(a+1) と同等です
print(f'~{a} = {~a}')

## 左シフト (<<): ビットを左にシフトし、右側をゼロで埋めます。
## 2**n を掛けることと同等です。
## 5 << 2 は 0101 が 10100 (10 進数 20) になることを意味します
print(f'{a} << 2 = {a << 2}')

## 右シフト (>>): ビットを右にシフトし、右側のビットを破棄します。
## 2**n で切り捨て除算することと同等です。
## 9 >> 2 は 1001 が 10 (10 進数 2) になることを意味します
print(f'{b} >> 2 = {b >> 2}')

ファイルを保存し、ターミナルからスクリプトを実行します。

python ~/project/operators.py

各ビット演算を示す出力が表示されます。

... (以前のステップからの出力) ...

--- Bitwise Operators ---
Binary of 5 is 0b101
Binary of 9 is 0b1001
5 & 9 = 1
5 | 9 = 13
5 ^ 9 = 12
~5 = -6
5 << 2 = 20
9 >> 2 = 2

これで、ビットレベルで整数を操作するためにビット演算子を使用する方法を学習しました。

メンバーシップ演算子と同一性演算子の使用

この最終ステップでは、メンバーシップ演算子(innot in)とアイデンティティ演算子(isis not)について学習します。メンバーシップ演算子は、値がシーケンス内に存在するかどうかをテストし、アイデンティティ演算子は、2 つの変数がメモリ内の全く同じオブジェクトを参照しているかどうかを確認します。

引き続きoperators.pyファイルを編集します。

まず、メンバーシップ演算子の例を追加しましょう。これらは通常、リスト、タプル、文字列などのシーケンスと共に使用されます。

以下のコードをoperators.pyファイルの末尾に追加してください。

## Membership Operators
print("\n--- Membership Operators ---")
my_list = [1, 3, 5, 7]
print(f'3 in {my_list} is {3 in my_list}')
print(f'4 not in {my_list} is {4 not in my_list}')

greeting = "hello world"
print(f'"world" in "{greeting}" is {"world" in greeting}')

ファイルを保存して実行します。

python ~/project/operators.py

メンバーシップ演算子の出力は次のようになります。

... (以前のステップからの出力) ...

--- Membership Operators ---
3 in [1, 3, 5, 7] is True
4 not in [1, 3, 5, 7] is True
"world" in "hello world" is True

次に、アイデンティティ演算子を探求しましょう。is(アイデンティティ)と==(等価性)の違いを理解することが重要です。==は 2 つのオブジェクトの値が同じかどうかをチェックし、isはそれらが同じオブジェクトであるかどうか(つまり、同じメモリアドレスを持っているか)をチェックします。

以下のコードをoperators.pyファイルに追加します。

## Identity Operators
print("\n--- Identity Operators ---")

## 小さな整数については、Python は同じオブジェクトを再利用することがよくあります。
x = 256
y = 256
print(f'x is y (for 256): {x is y}') ## これはしばしば True になります

## より大きな整数については、Python は別々のオブジェクトを作成する場合があります。
a = 257
b = 257
print(f'a is b (for 257): {a is b}') ## これはしばしば False になります

## リストのようなミュータブル(変更可能)なオブジェクトについては、内容が同じであっても、それらは異なるオブジェクトです。
list1 = [1, 2, 3]
list2 = [1, 2, 3]
print(f'list1 == list2: {list1 == list2}') ## 同等の内容をチェックします (True)
print(f'list1 is list2: {list1 is list2}') ## 同じオブジェクトかどうかをチェックします (False)
print(f'list1 is not list2: {list1 is not list2}') ## 異なるオブジェクトかどうかをチェックします (True)

ファイルを保存し、最後に一度実行します。

python ~/project/operators.py

出力は、等価性とアイデンティティの違いを示しています。

... (以前の例からの出力) ...

--- Identity Operators ---
x is y (for 256): True
a is b (for 257): True
list1 == list2: True
list1 is list2: False
list1 is not list2: True

メンバーシップ演算子とアイデンティティ演算子の使用に成功し、Python の主要な演算子の種類の探求を完了しました。

まとめ

この実験(Lab)では、Python における様々な種類の演算子について実践的な経験を積みました。まず、計算の実行や条件の評価を行うための基本的な算術演算子と比較演算子を探求しました。次に、効率的な変数更新のための代入演算子と、条件ロジックを組み合わせるための論理演算子の使用を練習しました。

さらに、低レベルのデータ操作のためにビット演算子を掘り下げ、最後に、アイテムの存在確認とオブジェクトの同一性確認のためにメンバーシップ演算子とアイデンティティ演算子で締めくくりました。VS Code エディタで各演算子タイプに対してコードを記述し実行することにより、今後の Python プログラミングでこれらの不可欠なツールを使用するための強固な基盤を築きました。