演算の基本概念として、1+2=3という式では1と2が被演算子、+が演算子となります。
算術演算子
Pythonにおける算術演算子は整数や浮動小数点数の演算を扱い、一項演算子と二項演算子に分類されます。
一項算術演算子
| 演算子 | 説明 |
|---|---|
| **-** | 符号反転 |
以下コードを実行してください:
val = 9
result = -val
print(val)
実行結果:
二項算術演算子
| 演算子 | 機能 |
|---|---|
| + | 加算 |
| - | 減算 |
| * | 乗算 |
| / | 除算 |
| % | 剰余 |
| ** | べき乗 |
| // | 商の整数部取得(**切り下げ**) |
以下コードを実行してください:
num1 = 10
num2 = 5
print(num1+num2)
print(num1-num2)
print(num1*num2)
print(num1/num2)
print(num1%num2)
print(num1**num2)
num1 = -9
num2 = 2
print(num1//num2)
実行結果:
注意点:
- 文字列の加算は連結処理となる(数字文字列でも同様)
- 文字列と他の型の加算はエラーを発生させる
- 除算結果は1小数以下の浮動小数点型となる
- 除数に0を指定するとZeroDivisionErrorが発生
- 文字列×整数は繰り返し処理となる
- Pythonでは++や--のようなインクリメント演算子は存在しない
- divmod()関数を使用すると商と余りを同時に取得できる。例:divmod(13,3) → (4,1)
以下コードを実行してください:
str1 = 'aaa'
str2 = 'bbb'
print(str1+str2)
str1 = '20'
str2 = '30'
print(str1+str2)
print(type(str1+str2))
str1 = 'hello'
print(str1*3)
実行結果:
比較演算子
2つの式の大小比較を行う。戻り値はBoolean型(True/False)となる。
| 演算子 | 例 | 説明 |
|---|---|---|
| == | a==b | 等価判定(基本型は値比較、参照型は同一オブジェクト判定) |
| != | a!=b | 非等価判定 |
| > | a>b | aがbより大きい場合True |
| < | a<b | aがbより小さい場合True |
| >= | a>=b | aがb以上の場合True |
| <= | a<=b | aがb以下の場合True |
Python3では「<>」演算子は廃止されている。
以下コードを実行してください:
str1 = 'Hello'
str2 = 'Hello'
print(str1==str2)
list1 = []
list2 = [1,2]
print(list1==list2)
print(list1<list2)
実行結果:
論理演算子
Boolean型の引数に対する演算を行う。戻り値はBoolean型となる。
| 演算子 | 名称 | 例 | 説明 |
|---|---|---|---|
| not | 論理否定 | not x | xがTrue→False、False→True |
| and | 論理積 | x and y | 両方Trueの時のみTrue |
| or | 論理和 | x or y | どちらかがTrueの時True |
注意点: 短絡評価の仕様により、x and yではxがFalseの場合はyを評価せずFalseを返す。x or yではxがTrueの場合はyを評価せずxを返す。
ビット演算子
2進数単位での演算を行う。操作対象と結果は整数型となる。
| 演算子 | 名称 | 例 | 説明 |
|---|---|---|---|
| ~ | ビット反転 | ~x | 各ビットを反転(0→1、1→0) |
| & | ビットAND | x&y | 共に1のビットのみ1 |
| | | ビットOR | x|y | どちらかが1のビットを1 |
| ^ | ビットXOR | x^y | 異なるビットのみ1 |
| >> | 右シフト | x>>n | nビット右にシフト(2のn乗で除算相当) |
| << | 左シフト | x<<n | nビット左にシフト(2のn乗で乗算相当) |
以下コードを実行してください:
val1 = 0b10110010
val2 = 0b01011110
print("val1 | val2 = {0}".format(val1|val2)) #0b11111110
print("val1 & val2 = {0}".format(val1&val2)) #0b00010010
print("val1 ^ val2 = {0}".format(val1^val2)) #0b11101100
print("~val1 = {0}".format(~val1)) #-179
num = 10
print("num >>2 = {0}".format(num>>2))
print("num <<2 = {0}".format(num<<2))
実行結果:
代入演算子
変数の自己更新を簡潔に記述するための記法。
| 演算子 | 名称 | 例 | 説明 |
|---|---|---|---|
| += | 加算代入 | a += b | a = a +b |
| -= | 減算代入 | a -= b | a = a - b |
| *= | 乗算代入 | a *= b | a = a*b |
| /= | 除算代入 | a /= b | a = a/b |
| %= | 剰余代入 | a %= b | a = a%b |
| **= | べき乗代入 | a **= b | a = a**b |
| //= | 床除算代入 | a //= b | a = a // b |
| &= | ビットAND代入 | a &= b | a = a&b |
| |= | ビットOR代入 | a |= b | a = a|b |
| ^= | ビットXOR代入 | a ^= b | a = a^b |
| <<= | 左シフト代入 | a <<=b | a = a<<b |
| >>= | 右シフト代入 | a >>=b | a = a>>b |
以下コードを実行してください:
val1 = 1
val2 = 2
val1 += val2
print("val1 + val2 = {0}".format(val1))
val1 -= val2
print("val1 - val2 = {0}".format(val1))
val1 *= val2
print("val1 * val2 = {0}".format(val1))
val1 /= val2
print("val1 / val2 = {0}".format(val1))
val1 = 0b1100
val2 = 0b1100
val1 |=val2
print("val1 | val2 = {0}".format(val1))
val1 ^=val2
print("val1 ^ val2 = {0}".format(val1))
実行結果:
その他の演算子
同一性判定演算子
オブジェクトの同一性を判定する。==演算子との違いは、==は値比較に対し、is/is notは同一オブジェクト判定を行う点である。
| 演算子 | 例 | 説明 |
|---|---|---|
| is | a is b | 同一オブジェクトか判定 |
| is not | a is not b | 同一オブジェクトでないか判定 |
要素包含判定演算子
シーケンス型に要素が含まれるか判定する。
以下コードを実行してください:
str1 = 'Hello'
str2 = 'Hello'
print(str1 is str2)
print('e' in str1)
print('hello' in str1)
実行結果:
演算子優先順位
複雑な式評価において優先順位が重要となる。大まかな優先順位は「算術→ビット→比較→論理→代入」の順となる。以下は優先度順位表。
| 順位 | 演算子 | 説明 |
|---|---|---|
| 1 | () | 括弧 |
| 2 | f(引数) | 関数呼び出し |
| 3 | [start:end],[start:end:step] | スライス |
| 4 | [index] | 添字アクセス |
| 5 | . | クラスメンバアクセス |
| 6 | ** | べき乗 |
| 7 | ~ | ビット反転 |
| 8 | + | 正負符号 |
| 9 | * / % | 乗算/除算/剰余 |
| 10 | + | 加算/減算 |
| 11 | >> << | ビットシフト |
| 12 | & | ビットAND |
| 13 | ^ | ビットXOR |
| 14 | | | ビットOR |
| 15 | in not in is is not < <= > >= != == | 比較演算子 |
| 16 | not | 論理否定 |
| 17 | and | 論理積 |
| 18 | or | 論理和 |
| 19 | lambda | ラムダ式 |