Pythonのoperatorモジュール徹底解説:標準演算子を関数として使う方法
はじめに
プログラミングにおける「演算子(オペレーター)」とは、加算・減算・比較などの特定の操作を実行するためにあらかじめ定義された記号(キー)のことです。Pythonには、算術演算、比較、ビット演算、メンバーシップ判定など、カテゴリ別に分類された豊富な組み込み演算子が用意されています。
Pythonの標準ライブラリにはoperatorモジュールが含まれており、このモジュールは組み込み演算子に対応する関数を提供します。関数名は対応する演算子の種類に沿って命名されており、例えば + 演算子に対応するのが add() 関数です。
ダンダーメソッドとの関係
PythonのObjectクラスには、各演算子記号に対応する「ダンダーメソッド」(名前の前後に二重アンダースコアが付いたメソッド)が定義されています。これらのダンダーメソッドをユーザー定義クラスで適切にオーバーライドすることで、演算子のオーバーロードを実現できます。operatorモジュールにも、これらに対応するダンダー形式の関数が含まれています。たとえば、add() と __add__() はどちらも + 記号と同じ動作を行います。
準備:operatorモジュールのインポート
まず、operatorモジュールから関数をインポートしましょう。
>>> from operator import *
算術演算子に対応する関数
算術演算子に対応する関数を確認するため、2つの変数を初期化します。
>>> a = 10 >>> b = 20
add()、sub()、mul() はそれぞれ +、-、* 演算子に対応します。除算の / 記号は truediv() 関数で実装されています。
>>> add(a,b) 30 >>> a + b 30 >>> sub(a,b) -10 >>> a - b -10 >>> mul(a,b) 200 >>> a * b 200 >>> truediv(a,b) 0.5 >>> a / b 0.5
その他の算術演算子である %(剰余)、**(べき乗)、//(切り捨て除算)は、それぞれ mod()、pow()、floordiv() 関数で実装されています。
>>> a = 5 >>> b = 3 >>> a % b 2 >>> mod(a,b) 2 >>> a ** b 125 >>> pow(a,b) 125 >>> a // b 1 >>> floordiv(a,b) 1
比較演算子に対応する関数
論理(比較)演算子の <、<=、>、>=、==、!= は、それぞれ lt()、le()、gt()、ge()、eq()、ne() 関数に対応しています。
>>> a = 5 >>> b = 7 >>> a < b True >>> lt(a,b) True >>> a <= b True >>> le(a,b) True >>> a > b False >>> gt(a,b) False >>> a >= b False >>> ge(a,b) False >>> a == b False >>> eq(a,b) False >>> a != b True >>> ne(a,b) True
シーケンスを操作する関数
Pythonの組み込み演算子のうち、in(メンバーシップ判定)、+(連結)、del(削除)は、それぞれ contains()、concat()、delitem() 関数で実装されています。また、インデックスによる代入 seq[x] = y には setitem() 関数、値の取得 seq[x] には getitem() 関数を使用します。
>>> a = [1,2,3] >>> b = ['a','b','c'] >>> a + b # シーケンスの連結 [1, 2, 3, 'a', 'b', 'c'] >>> concat(a,b) [1, 2, 3, 'a', 'b', 'c'] >>> contains(a,'2') # in演算子の実装(文字列'2'は含まれない) False >>> contains(a,2) True >>> 2 in a True >>> b[1] = 'x' # インデックス代入(setitem()に相当) >>> b ['a', 'x', 'c'] >>> setitem(b,1,'b') >>> b ['a', 'b', 'c'] >>> a[1] # インデックス位置の値を取得(getitem()に相当) 2 >>> getitem(a,1) 2 >>> del b[2] # インデックス位置の要素を削除(delitem()に相当) >>> b ['a', 'b'] >>> delitem(a,2) >>> a [1, 2]
インプレース演算子(累算代入)
代入と計算を1ステップで同時に行う演算子は「インプレース演算子」と呼ばれます。Pythonのインプレース演算子にも、operatorモジュール内に対応する関数が用意されています。加算と代入を同時に行う += 演算子には iadd() 関数が対応しており、同様に各演算子関数の先頭に「i」を付けたものがインプレース版となります。
インプレース加算
>>> a = 10 >>> b = 20 >>> a = iadd(a,b) # a += b と同等 >>> a 30
インプレース減算
>>> a = 10 >>> b = 20 >>> a = isub(a,b) # a -= b と同等 >>> a -10
インプレース乗算
>>> a = 10 >>> b = 20 >>> a = imul(a,b) # a *= b と同等 >>> a 200
インプレース除算
>>> a = 10 >>> b = 4 >>> a = itruediv(a,b) # a /= b と同等 >>> a 2.5
ビット演算子に対応する関数
operatorモジュールには、標準的なビット演算子を実装した関数も含まれています。
>>> and_(10,2) # 10 & 2 と同等 2 >>> or_(10,2) # 10 | 2 と同等 10 >>> xor(10,2) # 10 ^ 2 と同等 8 >>> lshift(10,2) # 10 << 2 と同等 40 >>> rshift(10,2) # 10 >> 2 と同等 2
まとめ
operatorモジュールを使うことで、Pythonのすべての標準演算子を関数として扱うことができます。特に、sorted() の key 引数に関数を渡す場面や、functools.reduce() と組み合わせる場合など、関数オブジェクトが必要なコンテキストで非常に役立ちます。演算子と関数名の対応関係を覚えておくと、より柔軟で読みやすいコードを書けるようになるでしょう。
-
Pythonの演算子関数とは?operatorモジュールの基本と使い方
Pythonには、算術演算・論理演算・比較演算・ビット演算といった数学的な操作を行うための標準ライブラリ関数が用意されています。これらの関数はすべてoperatorモジュールにまとめられています。 operatorモジュールを利用するには、まず標準ライブラリからインポートする必要があります。 import operator この記事では、operatorモジュールが提供する演算子関数のうち、特に使用頻度の高い「算術演算」と「比較(関係)演算」の関数を、サンプルコードと実行結果あわせて解説します。 算術演算の関数 まずは、四則演算など基本的な計算を行う関数から見ていきましょう。主な関数は以下
-
Pythonのdecimalモジュール徹底解説!sqrt・exp・log・compareなど主要関数の使い方
Pythonには、10進浮動小数点数(decimal floating point)を扱うためのdecimalモジュールが標準ライブラリとして用意されています。このモジュールを使うと、正しく丸められた高精度な浮動小数点演算が可能になります。 通常のfloat型は内部で2進数によって数値を表現するため、「0.1 + 0.2」が厳密には0.3にならないといった誤差が発生します。decimalモジュールは、金額計算など厳密な精度が求められる場面で特に役立ちます。 利用するには、まずdecimalモジュールをインポートします。 import decimal 本記事では、decimalモジュールで使える