演算子

ここでは演算子について学びます。ごちゃごちゃいうのはこのサイトの役割では無いのですが、Pythonで演算子とされているものと一般には演算子として理解されているものついて説明します。

ここで学習すること

  • 演算子
    • 算術演算 (+ – * ** / // % @)
    • ビット演算 ( & | ^ ~)とシフト演算 (<< >>)
    • 比較演算 (< > <= >= == !=)
  • 一般には演算子と理解されるもの
    • 代入演算 (= += -= …)
    • ブール演算 (and or not is in)
  • 演算子の優先順位

説明

算術演算 (+ – * ** / // %)

いわゆる四則演算に類する演算を行うものです。

使用例説明
+x正数 (単項算術演算子)
-x負数 (単項算術演算子)
x + y加算 (二項算術演算)
x – y減算 (二項算術演算)
x * y乗算 (二項算術演算)
x ** yaのb乗 (べき乗演算)
x / y除算 (二項算術演算)
x // y切り捨て除算 (二項算術演算)
x%yx を y で割った余り (二項算術演算)
x @ y行列の乗算 (二項算術演算)

ビット演算( & | ^ ~) と シフト演算(<< >>)

それほどみんながみんな使う演算でもありませんね。こっちの方が高速みたいな俺知ってるぜロジックを書いていたのは今や昔です。まぁでもゲームで毒で眠りで、なんとかでーとかってステータスの演算するような場合には知ってて良かったかなという感じでしょうか。(私はゲームを一度も開発したことはありませんが)

使用例説明
~xビット反転
x & yAND 論理積(x、yともに1のビットが1になる)
x | yOR 論理和(xまたはyが1のビットが1になる)
x ^ yXOR 排他的論理和(xまたはyが1のビットが1)
x << yyビット左にシフト
x >> yyビット右にシフト

比較演算 (< > <= >= == !=)

これは見ての通りのものが多いのでわかりやすいかも知れません。

使用例説明
x < yxよりyが大きいときTrue
x > yxよりyが大きいときTrue
x<=yx がy 以下のときTrue
x>=yx がy 以上のときTrue
x==yx とy が等しいときTrue
x!=yx とy が等しくないときTrue

代入演算 (= += -= …)

文と式とインデントでも記載しましたが「=」は数学と違って代入でしたね。その仲間です。

使用例説明
z = x + yx + y の結果を z に代入
x += 1x = x + 1 に同じ
x -= 1x = x – 1 に同じ
x *= yx = x * y に同じ
x /= y x = x / y に同じ
x %= yx = x % y に同じ
x **= yx = x ** y に同じ
x //= yx = x // y に同じ
x &= yx = x & y に同じ
x |= yx = x | y に同じ
x^= yx = x ^ y に同じ
x <<= yx = x << y に同じ
x >>= yx = x >> y に同じ

ブール演算 (and or not is in)

ドキュメント内での代名詞も揺らぎがあるのですが、言語上の分類はキーワードですが役割は他の言語と同じ演算子で、しばしば比較演算子という形で登場します。比較演算(比較演算子を使った式)は、TrueまたFalseのブール値を返します。

使用例説明
x and yx かつ y のときTrue
x or yx または y のときTrue
not xx がFalseのときTrue
x is yx と y が同一オブジェクトであるときTrue
item in itemListitemがitemListの要素であればTrue
リスト、タプル、辞書などで使用

isとinについて、少し動かして確認してみたいと思います。

#!/usr/bin/env python3.8

value1 = [1, 2, 3]
value2 = [1, 2, 3]

print(value1 == value2)
print(value1 is value2)

value2 = value1
print(value1 == value2)
print(value1 is value2)

print("---")
print( 1 in value1)
print( 4 in value1)

実行結果

$ python sample.py
True
False
True
True
---
True
False
$

上から順に「==」は値を比較しているのでTrue。

「is」は同一オブジェクトかどうかで当然別々なのでFalse。

value2にvalue1を代入したので「==」は変わらずTrueで、今度は「is」もTrueを返します。

最後に「in」ですが、1は要素の1つですが、4は要素にないので、それぞれTrue、Falseとなります。

演算子の優先順位

今回取り上げたものを上から低い順に並べると以下のようになります。

演算子説明
orブール演算 OR
andブール演算 AND
not xブール演算 NOT
innot inisis not<<=>>=!===比較演算
|ビット単位 OR
^ビット単位 XOR
&ビット単位 AND
<<>>シフト演算
+-加算および減算
*@///%乗算、行列乗算、除算、切り捨て除算、剰余 
+x-x~x正数、負数、ビット単位 NOT
**べき乗 

きちんとテストすれば、もし間違っていても気がつくとは思いますが、自信がなくとも()で囲った方が視覚的な効果によって優先順位が分かり安くなるという側面もありますので、無理は禁物です。()にも適宜頼りましょう。なお()で式を囲ったものはこの表に入れると最下行になります。