【基礎文法】Pythonで使える演算子

スポンサーリンク
Pythonの基本文法_導入編_演算子 Python

Pythonで使える演算子

本記事ではPythonで使える演算子についてまとめています。

前回紹介した数値演算子以外にも演算対象の種類によって、文字列、比較、論理、ビットについて各種リテラルを扱う演算子があります。またオブジェクトを対象にした演算子もありますのでその概要について、本記事の中で説明しています。

重要度:★★★★★

スポンサーリンク

1.  演算子

文字列、比較、論理、ビットについて各種リテラルを扱う演算子について説明します。

Python 公式ドキュメント

https://docs.python.org/ja/3/reference/expressions.html#operator-precedence

1.1 文字列演算子

文字列演算子

文字列の連結、生成に関する演算子は以下となります。

演算子説明
+“a”+”b”文字列”a”と”b”の連結。文字列(”ab”)となる。
*“abc”*n文字列”abc”をn回繰り返す。

文字列の連結と効率よく生成するときに使うのが文字列演算子です。Pythonでは2種類用意されています。”&”などでも文字列を連結するプログラミング言語もありますが、Pythonでは”+”のみです。


例1. 次は、文字列どうしと文字列と変数(文字列が格納)の連結する例を示しています。連結できるブロック数に上限はなく、いくつでも”+”で連結できます。(➀➁)また、文字列を格納した変数も同様に連結することができます。(➂➃)

# 文字列の組み合わせ
print("ABC" + "_EFG")           # ➀ ABC_EFG
print("ABC" + "_EFG" + "_HIG")  # ➁ ABC_EFG_HIG

 # 文字列と変数の組み合わせ
name = "Suzuki"
print("Hello_" + name)                     # ➂ Hello_Suzuki
print("Hello_" + name + "_Good Day")       # ➃ Hello_Suzuki

例2.文字列演算子”+” は文字列専用の演算子なので、数値をそのまま連結することができません。➀のようにエラーメッセージ(TypeError)が表示されます。数値は➁のように”str()関数“を使って一度文字列に変換することで連結することができるようになります。

# 文字列と数字の組み合わせ(連結)
print("ABC" + 500)                 # ➀ TypeErrorが出力される
# TypeError: can only concatenate str (not "int") to str

print("ABC" + str(500))            # ➁ ABC500

例3.Pythonには、連結の他にも文字列を効率よく生成するために* ”文字列演算子が用意されています。使用例は次の通りで「”文字列” * 回数」と記述します。単語、複数文字、記号など””で囲ったステートメント部分を指定した回数分繰り返したものが生成されます。

# 文字列の繰り返し

print("A"*5)        # ➀ AAAAA       文字
print("ABC"*3)      # ➁ ABCABCABC   文字列
print('*'*10)       # ➂ **********  記号

1.2 比較演算子

比較演算子

2値の大小比較を行う演算子は以下となります。

演算子説明
==a == baとbが等しいときにTrueとなる。
!=a != baとbが等しくないときにTrueとなる。
>a > baがbより大きいときTrueとなる。
>=a >= baがb以上のときTrueとなる。
<a < baがbよりも小さいときTrueとなる。
<=a <=baがb以下のときTrueとなる。

リテラル(数値、文字列、Boolなど)の大小等価比較を行うのが比較演算子です。Pythonでは上記のとおり6種類用意されています。


例1.次は6種類すべての比較演算子の使用例を示した例になります。以上、以下は”>=“、”<=“のように”=”をくっつけて表記します。間にスペース記号などを挟むとエラーとなります。等号比較は ”==“, “!=“といったように表記します。

num1 = 5;   num2 = 5;   num3 = 10;

#等号比較
print(num1 == num2)     #➀ True (5 == 5)
print(num1 == num3)     #➁ False (5 == 10)

print(num1 != num2)     #➂ False (5 != 5)
print(num1 != num3)     #➃ True (5 != 10)
#-------------------------------------------
#大なり比較
print(num1 > num2)      #➄ False (5 > 5)
print(num3 > num1)      #➅ True (10 > 5)

print(num1 >= num2)     #➆ True (5 >= 5)
print(num3 >= num1)     #➇ True (10 >= 5)
#-------------------------------------------
#小なり比較
print(num1 < num3)      #➈ True (5 < 10)
print(num3 < num1)      #➉ False (10 < 5)

print(num1 <= num3)     #⑪ True (5 <= 10)
print(num3 <= num1)     #⑫ False (10 <= 5)
#-------------------------------------------

例2. Pythonならではの書き方として、一つの変数に対して次のように2つの比較演算子を使うことができます。他言語ではこのように書くことはできませんので、2回に分けて記述します。もちろんPythonも2回に分ける書き方もできます。より数学的に記述するこのスタイルを積極的に使いたいところです。

num = 20
print(10 <= num <= 25)      #➀ True

num = 30
print(10 <= num <= 25)      #➁ False

num = -5
print(-10 <= num <= 0)      #➂ True

num = -15
print(-10 <= num <= 0)      #➃ False
#-------------------------------------------

1.3 論理演算子

論理演算子

2値の論理比較を行う演算子は以下となります。

演算子説明
anda and b論理積 aかつbがTrueのときTrue。一方でもFalseならFalse。
ora or b論理和 aまたはbがTrueのときTrue。両方FalseならFalse。
notnot a否定  aがTrueならFalse。FalseならTrue。

Pythonで論理比較を行う演算子は”and”, “or”, “not”の3つです。


例1.論理演算子の動作例を示します。

# < and/orの使い方 >

print( False and False)     #➀ False    両方がFlaseもしくは片方でもFalseならFalse
print( False or False)      #➁ False    両方Falseの場合のみFalse

print( False and True)      #➂ False
print( False or True)       #➃ True     片方がTrueであればTrue

print( True and True)       #➄ True     両方がTrueの場合のみTrue
print( True or True)        #➅ True

# < notの使い方 >

print(not True)             #➆ False    論理を反転する
print(not False)            #➈  True
#-------------------------------------------

演算対象が3つ以上となっても使い方は同じです。

# < 3項の場合 >

print( False and False and False)     #➀ False
print( False or False or False)       #➁ False

print( False and False and True)      #➂ False
print( False or False or True)        #➃ True
#-------------------------------------------

2.次は具体的な論理式どうしを比較する例を示しています。

# <具体的な使い方>
num = 80
print((num >= 50) and (num <= 100))   #➀ True    1項、2項ともTrueなので式全体がTrue

num = 110
print((num >= 50) and (num <= 100))   #➁ False   2項目がFalseなので式全体がFalse

#-------------------------------------------

また、Boolean型(True、Flase)はそれぞれ数値の1,0の規定値で表され、次の➂➃➄のようにBoolean型どうしで演算することができます。

Trueは1以上の整数であればTrueと解釈され➅➆のように演算することができますが、論理和がTrueとなる場合は1項が評価され、論理積がTrueとなる場合は2項が評価され出力されます。

# Trueは数値で1、Flaseは数値で0を表す
print(True + True)      #➂ 2    1 + 1 と同義
print(True + False)     #➃ 1    1 + 0 と同義
print(False + False)    #➄ 0    0 + 0 と同義

# True/False/0/1以外で論理式が使われた場合
print(2 or 3)           #➅ 2    1項が採用される
print(2 and 3)          #➆ 3    2項が採用される
#-------------------------------------------

1.4.  ビット演算子

ビット演算子

ビット(列)を対象にした論理演算子は以下になります。


演算子説明
a & b論理積(AND 両ビット1のとき1となる)
|a | b論理和(OR どちらかのビットが1ならば1となる)
^a ^ b排他的論理和(XOR 比較したビットが異なるなら1となる)
-a否定(NOT ビットを反転させる)
<<a << n左シフト、aの値は2のn乗になる。
>>a >> n右シフト、aの値は2の(-n)乗になる。

ビット(列)どうしには上記6つの演算子をPythonでは使います。論理積(AND)・論理和(OR)などから論理シフト(<<, >>)まで一般的な演算の実行ができるようになっています。


例1.以下でビット演算子の使用例をいくつか紹介しています。

➀~➃は1ビットどおしの演算結果です。ビット演算子の結果は10進数に自動変換されてしまうので、ここでは分かりやすさのためbin()関数でビット表記に戻しています。

➄➅ではビット列どおしの演算結果です。&、|、^を使うことでビットマスク・反転などに応用できます。詳細については論理回路などの専門書に説明を譲ります。

print(bin(0b0 & 0b1))   #➀ 0b0
print(bin(0b1 & 0b1))   #➁ 0b1   # 1,2項ともに’0b1’の場合のみ’0b1’となる

print(bin(0b0 | 0b0))   #➂ 0b0   # 1,2項ともに’0b0’の場合のみ’0b0’となる
print(bin(0b0 | 0b1))   #➃ 0b1


num1 = 0b101010
num2 = 0b111000

print(bin(num1 & num2)) #➄ 0b101000
print(bin(num1 | num2)) #➅ 0b111010
#-------------------------------------------

続いて、ビットシフト演算子の使用例を示します。ビットをシフトするたびに2のn乗、または2の-n乗倍になります。

num3 = 0b0001
# <左シフト>
print(bin(num3 << 1))   #➀ 0b10      Dec(2)    ※以降2のn乗倍となる
print(bin(num3 << 2))   #➁ 0b100     Dec(4)
print(bin(num3 << 3))   #➂ 0b1000    Dec(8)

num4 = 0b1000
# <右シフト>
print(bin(num4 >> 1))   #➃ 0b100     Dec(4)  ※以降2の(-n)乗倍となる
print(bin(num4 >> 2))   #➄ 0b10      Dec(2)
print(bin(num4 >> 3))   #➅ 0b1       Dec(1)
#-------------------------------------------

2.  オブジェクトの比較

これまでに紹介した演算子は、対象がリテラル(値)のものでした。演算子にはもう一つオブジェクトを対象にした演算子というものがあります。

オブジェクトとは、あるクラス(定義型)から生成されたインスタンス(実体)のことをいい、メモリアドレスに割り当てられた、実体のことを指します。リテラル(値)とは明確に区別されます。詳細はクラス、オブジェクト指向の記事で後述しますので、使い方のみ解説します。

Python 公式ドキュメント

https://docs.python.org/ja/3/reference/expressions.html#in

2.1  オブジェクトの比較

オブジェクトの比較

オブジェクトの比較を行う演算子は以下になります。


演算子説明
isa is baとbが同一のオブジェクトのときにTrueとなる。
is not“a” is not “b”aとbが同一のオブジェクトでないときにTrueとなる。

2つのオブジェクトが等しいか等しくないか(同じメモリアドレスを指しているか、いないのか)を調べる演算子となります。


例1. 次の例はListクラスのオブジェクト(ここではlist_obj1, list_ojb2)があります。2つは全く同じ値を要素に持つオブジェクトですが、➀のようにis演算子で比較すると”False”つまり別物のオブジェクトとなります。➂のように今度は同じオブジェクトを示していることがわかります。

list_obj1 = [1, 2, 3]
list_obj2 = [1, 2, 3]

print(list_obj1 is list_obj2)   #➀ False 2つは別のオブジェクトを指している。

#-------------------------------------------

その次に➁のように2つのリストを代入した後の結果はどうなるでしょうか?

list_obj2 = list_obj1           #➁ list_obj1をlist_obj2に代入する。

print(list_obj1 is list_obj2)   #➂ True 2つは同じオブジェクトを指している。
#-------------------------------------------

➂のように今度は同じオブジェクトを示していることがわかります。さらに、➃のようにlist_ojb1だけに要素”4″を追加したとします。list_ojb2はどうなっていると思いますか?

おそらく変更を加えていないlist_obj2は[1, 2, 3]のままだと予想されるのではないでしょうか。

list_obj1.append(4)             #➃ list_obj1に要素"4"を追加する
print(list_obj1)                #➄ [1, 2, 3, 4]
print(list_obj2)                #➅ [1, 2, 3, 4]  list_obj2の内容も変わっている
#-------------------------------------------

実際は➄,➅に示すように、list_ojb2にも変更が反映されていることがわかります。つまり、2つのリストは同じオブジェクト、同じアドレスの値を指していることを示しています。

このように、オブジェクト指向を採用するPythonではオブジェクト間の参照関係を常に意識してコーディングする必要があります。その比較を行う演算子がこの”is”と”not is”になるというわけです。

3. まとめ

最後に、この記事のまとめになります。

  • 文字列、比較、論理、ビット扱う演算子が用意されている
  • リテラル以外にもオブジェクト扱う演算子に”in”, ”not in”がある。

最後までお読み頂きありがとうございました。

次の記事では、制御構文について解説していきます。

タイトルとURLをコピーしました