🐍

精読「独習Python」(演算子)

2024/12/25に公開



独習Python
「独習Python」は、初心者から中級者までを対象に、Pythonの基礎から応用までを体系的に学べる入門書で、豊富な例題と練習問題を通じて実践的なスキルを身につけられる一冊です。

関連記事

演算子

  • 演算子オペレーター):与えられた変数やリテラルに対して、あらかじめ決められた処理を行うための記号
  • 被演算子オペランド):演算子によって処理される変数/リテラルのこと

    被演算子とはより

算術演算子

  • 算術演算子:コンピューターで数値の計算を行う際に使用される記号や命令
演算子 概要
+ 足し算 2 + 35
- 引き算 5 - 23
* 掛け算 3 * 412
** 累乗(べき乗) 2 ** 38
/ 除算(浮動小数点) 10 / 42.5
// 除算(整数部のみ) 10 // 42
% 剰余(余り) 10 % 42
  • 演算子の役割はオペランドのデータ型によって変化する
# 数値型の例
result_numeric = 3 + 5  # 足し算
print(result_numeric)   # 出力: 8

# 文字列型の例
result_string = "Hello" + " " + "World"  # 文字列結合
print(result_string)    # 出力: "Hello World"
  • 除算を表す演算子「/」「//
# 通常の除算
print(7 / 2)  # 出力: 3.5 (浮動小数点数)
# 切り捨て除算
print(7 // 2)  # 出力: 3 (整数部分のみ)
  • 浮動小数点の演算には要注意:コンピュータが浮動小数点数を2進数で近似的に表現し、丸め誤差が生じるため、正しい結果が得られない
print(0.2 * 3)    # 結果:0.6000000000000001
print(0.2 == 0.6) # 出力:False

代入演算子

  • 代入演算子:左辺で指定した変数に対して、右辺の値を設定(代入) するための演算子(複合代入演算子[1]も含まれる)
演算子 概要
= 右辺の値を左辺の変数に代入する x = 10
+= 左辺の変数に右辺の値を加算して代入 x += 5 # x = x + 5
-= 左辺の変数から右辺の値を減算して代入 x -= 3 # x = x - 3
*= 左辺の変数に右辺の値を乗算して代入 x *= 4 # x = x * 4
/= 左辺の変数を右辺の値で除算して代入 x /= 2 # x = x / 2
//= 左辺の変数を右辺の値で整数除算し代入 x //= 2 # x = x // 2
%= 左辺の変数を右辺の値で剰余を計算し代入 x %= 3 # x = x % 3
**= 左辺の変数を右辺の値で累乗して代入 x **= 2 # x = x ** 2
&= 左辺の変数に右辺の値でビットANDして代入 x &= 3 # x = x & 3
|= 左辺の変数に右辺の値でビットORして代入 x |= 2 # x = x
^= 左辺の変数に右辺の値でビットXORして代入 x ^= 1 # x = x ^ 1
<<= 左辺の変数を右辺の値でビット左シフトし代入 x <<= 2 # x = x << 2
>>= 左辺の変数を右辺の値でビット右シフトし代入 x >>= 1 # x = x >> 1
  • 数値のインクリメント/デクリメント:pythonには「++」「--」演算子はないが、代わりに「+=」「-=」がある
x += 1
y -= 1
  • =」演算子による代入は参照の引き渡し
  • ミュータブルとイミュータブル:型がミュータブル/イミュータブルいずれであるかによって、値を操作したときの影響範囲が変化する
# ミュータブル(変更可能)の場合
list1 = [1, 2, 3]
list2 = data1
list1[0] = 100
print(list1) # 出力: [100, 2, 3]
print(list2) # 出力: [100, 2, 3]

# イミュータブル(変更不可)の場合
x = 1
y = x
x += 10  # ここでxは別のオブジェクトに差し替わっている
print(x) # 出力:11
print(y) # 出力:1
  • アンパック代入:リスト/辞書などを分解し、配下の要素を個々の変数に分解するための構文
numbers = [1, 2, 3]
a, b, c = numbers  # リストから値を取り出して変数に代入

print(a)  # 出力: 1
print(b)  # 出力: 2
print(c)  # 出力: 3
  • 新しい代入演算子「:=(セイウチ演算子)」:代入式が使えるようになった(Python3.8)
y = (x := 20) / 10
print(y)           # 出力:2.0

比較演算子

  • 比較演算子:左辺と右辺の値を比較し、その結果をTrue/Falseとして返す(関係演算子ともいう)
演算子 概念
== 等しい 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)
is 同一オブジェクトかどうか x is y(xとyが同一オブジェクトの場合True)
is not 同一オブジェクトでないか x is not y(xとyが異なるオブジェクトの場合True)
in コレクション内に存在する 'a' in ['a', 'b', 'c']('a'がリストに含まれる場合True)
not in コレクション内に存在しない 'd' not in ['a', 'b', 'c']('d'がリストに含まれない場合True)
  • 同一性と同値性:比較演算子を利用するうえで、同一性[2]同値性[3]を区別することは重要
list1 = [1, 2, 3]
list2 = [1, 2, 3]

# 同値性の比較(値が等しいか)
print(list1 == list2)  # True(値は同じ)

# 同一性の比較(同じオブジェクトか)
print(list1 is list2)  # False(異なるリストオブジェクト)
  • 条件演算子:指定された条件式の真偽に応じて、対応する式の値を返す
num = 7
result = "奇数" if num % 2 != 0 else "偶数"
print(f"{num}{result}")  # 7 は 奇数

論理演算子

  • 論理演算子:複数の条件式(または真偽値)を論理的に結合し、その結果をTrue/Falseとして返す
演算子 概要
and すべての条件が真の場合にTrueを返す x > 0 and x < 10(xが0より大きく10未満の場合True)
or いずれかの条件が真の場合にTrueを返す x < 0 or x > 10(xが0未満または10を超える場合True)
not 条件の真偽を反転させる not (x > 0)(xが0より大きい場合False、そうでない場合True)

  • ショートカット演算:論理積/論理和演算で左式だけが評価されて右式が評価されない(短絡演算ともいう)
x = 1
x == 2 or print(`実行されました`) # 右辺は「==2」がFalseのときのみ実行される(非推奨の書き方)
  • 比較演算子の連結:範囲を表現するときなどに便利
10 <= x <= 100 # 10~100の範囲を表現するときに良い(x >=50 and x <= 100よりわかりやすい)

ビット演算子

  • ビット演算子:整数を2進数で表したときの各桁(ビット単位)を論理計算する演算
演算子 概要
& ビット論理積(AND) a & b → 各ビットでAND演算
| ビット論理和(OR) a | b → 各ビットでOR演算
^ ビット排他的論理和(XOR) a ^ b → 各ビットでXOR演算
~ ビット反転(NOT) ~a → 各ビットを反転
<< 左シフト(ビットを左にシフト) a << nanビット左にシフト
>> 右シフト(ビットを右にシフト) a >> nanビット右にシフト

演算子の優先順位と結合則

  • 演算子の優先順位:1つの式の中に複数の演算子がある場合、優先順位の高い順に演算を行う
演算子の優先順位

これだけの演算子の優先順位をすべて覚えるのは現実的ではない…

優先順位 演算子 説明
1 () 括弧(最優先)
2 ** 指数(べき乗)
3 +x, -x, ~x 単項演算子(正、負、反転)
4 *, /, //, % 乗算、除算、整数除算、剰余演算
5 +, - 加算、減算
6 <<, >> シフト演算
7 & ビットAND演算
8 ^ ビットXOR演算
9 | ビットOR演算
10 ==, !=, >, <, >=, <= 比較演算子
11 not 論理NOT(単項)
12 and 論理AND(短絡評価)
13 or 論理OR(短絡評価)
14 = 代入演算子
15 := ウォルラス演算子(代入)
  • 結合則:優先順位の同じ演算子が並んでいる場合に、演算子を左から右、右から左のいずれの方法に処理するかを決めるルール
3 + 6 - 2 # 左から右への演算(基本) (3 + 6) - 2と意味的に等価
5**2**4   # べき乗演算子(**)と代入演算子(=)は、右結合 5**(2**4)と意味的に等価

参考



https://wa3.i-3-i.info/word13305.html

脚注
  1. 算術演算子やビット演算子などを合わせた機能を提供する ↩︎

  2. 参照値が同じオブジェクトを参照していること ↩︎

  3. オブジェクトが同じ値を持っていること ↩︎

Discussion