ここでは演算子について学びます。ごちゃごちゃいうのはこのサイトの役割では無いのですが、Pythonで演算子とされているものと一般には演算子として理解されているものついて説明します。
ここで学習すること
- 演算子
- 算術演算 (+ – * ** / // % @)
- ビット演算 ( & | ^ ~)とシフト演算 (<< >>)
- 比較演算 (< > <= >= == !=)
- 一般には演算子と理解されるもの
- 代入演算 (= += -= …)
- ブール演算 (and or not is in)
- 演算子の優先順位
説明
算術演算 (+ – * ** / // %)
いわゆる四則演算に類する演算を行うものです。
| 使用例 | 説明 |
| +x | 正数 (単項算術演算子) |
| -x | 負数 (単項算術演算子) |
| x + y | 加算 (二項算術演算) |
| x – y | 減算 (二項算術演算) |
| x * y | 乗算 (二項算術演算) |
| x ** y | aのb乗 (べき乗演算) |
| x / y | 除算 (二項算術演算) |
| x // y | 切り捨て除算 (二項算術演算) |
| x%y | x を y で割った余り (二項算術演算) |
| x @ y | 行列の乗算 (二項算術演算) |
ビット演算( & | ^ ~) と シフト演算(<< >>)
それほどみんながみんな使う演算でもありませんね。こっちの方が高速みたいな俺知ってるぜロジックを書いていたのは今や昔です。まぁでもゲームで毒で眠りで、なんとかでーとかってステータスの演算するような場合には知ってて良かったかなという感じでしょうか。(私はゲームを一度も開発したことはありませんが)
| 使用例 | 説明 |
| ~x | ビット反転 |
| x & y | AND 論理積(x、yともに1のビットが1になる) |
| x | y | OR 論理和(xまたはyが1のビットが1になる) |
| x ^ y | XOR 排他的論理和(xまたはyが1のビットが1) |
| x << y | yビット左にシフト |
| x >> y | yビット右にシフト |
比較演算 (< > <= >= == !=)
これは見ての通りのものが多いのでわかりやすいかも知れません。
| 使用例 | 説明 |
| x < y | xよりyが大きいときTrue |
| x > y | xよりyが大きいときTrue |
| x<=y | x がy 以下のときTrue |
| x>=y | x がy 以上のときTrue |
| x==y | x とy が等しいときTrue |
| x!=y | x とy が等しくないときTrue |
代入演算 (= += -= …)
文と式とインデントでも記載しましたが「=」は数学と違って代入でしたね。その仲間です。
| 使用例 | 説明 |
| z = x + y | x + y の結果を z に代入 |
| x += 1 | x = x + 1 に同じ |
| x -= 1 | x = x – 1 に同じ |
| x *= y | x = x * y に同じ |
| x /= y | x = x / y に同じ |
| x %= y | x = x % y に同じ |
| x **= y | x = x ** y に同じ |
| x //= y | x = x // y に同じ |
| x &= y | x = x & y に同じ |
| x |= y | x = x | y に同じ |
| x^= y | x = x ^ y に同じ |
| x <<= y | x = x << y に同じ |
| x >>= y | x = x >> y に同じ |
ブール演算 (and or not is in)
ドキュメント内での代名詞も揺らぎがあるのですが、言語上の分類はキーワードですが役割は他の言語と同じ演算子で、しばしば比較演算子という形で登場します。比較演算(比較演算子を使った式)は、TrueまたFalseのブール値を返します。
| 使用例 | 説明 |
| x and y | x かつ y のときTrue |
| x or y | x または y のときTrue |
| not x | x がFalseのときTrue |
| x is y | x と y が同一オブジェクトであるときTrue |
| item in itemList | itemが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 |
in, not in, is, is not, <, <=, >, >=, !=, == | 比較演算 |
| | ビット単位 OR |
^ | ビット単位 XOR |
& | ビット単位 AND |
<<, >> | シフト演算 |
+, - | 加算および減算 |
*, @, /, //, % | 乗算、行列乗算、除算、切り捨て除算、剰余 |
+x, -x, ~x | 正数、負数、ビット単位 NOT |
** | べき乗 |
きちんとテストすれば、もし間違っていても気がつくとは思いますが、自信がなくとも()で囲った方が視覚的な効果によって優先順位が分かり安くなるという側面もありますので、無理は禁物です。()にも適宜頼りましょう。なお()で式を囲ったものはこの表に入れると最下行になります。