Python 標準ライブラリ operator 演算
Publish date: 2021-04-11
Pythonの標準のoperatorライブラリを使うと+
や*
といった演算に、関数の形式でアクセスできます。
operatorの例
import operator
operator.add(1, 2) # => 3
operator.add("a", "bc") # => 'abc'
operatorが提供する関数
次節の「演算子と関数の対応の一覧」にあるもの以外で、operatorが提供している関数の紹介します。
abs(obj) 絶対値
operator.abs(-1) # => 1
operator.abs(-2.5) # => 2.5
index(a) 整数変換
operator.index(-1) # => -1
# __index__()と同じ
(-1).__index__() # => -1
countOf(a, b) aの中にbが出現する回数
operator.countOf([1,2,1,2,3,3,1,2], 1) # => 3
operator.countOf("aabaabcac", "a") # => 5
indexOf(a, b) aで最初にbが出現するインデックス
operator.indexOf([1,2,1,2,3,3,1,2], 2) # => 1
operator.indexOf("aabaabcac", "b") # => 2
length_hint(obj, default=0) 概算の長さ
operator.length_hint([1,2,1,2,3,3,1,2]) # => 8
operator.length_hint("aabaabcac") # => 9
attrgetter(attr), attrgetter(*attrs) 属性へのアクセス
class Name:
def __init__(self, first, last):
self.first = first
self.last = last
class User:
def __init__(self, first_name, last_name, department):
self.name = Name(first_name, last_name)
self.department = department
u = User('Yamada', 'Taro', 'A10')
department_getter = operator.attrgetter('department')
department_name_getter_1 = operator.attrgetter('department', 'name')
department_name_getter_2 = operator.attrgetter('department', 'name.first', 'name.last')
department_getter(u) # => 'A10'
department_name_getter_1(u) # => ('A10', <__main__.Name at 0x2dbc8c2c880>)
department_name_getter_2(u) # => ('A10', 'Yamada', 'Taro')
itemgetter(item),itemgetter(*items) 要素へのアクセス
d = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5}
key_getter_1 = operator.itemgetter('a')
key_getter_2 = operator.itemgetter('c','d')
key_getter_1(d) # => 1
key_getter_2(d) # => (3, 4)
l = [10, 20 ,30, 40, 50]
index_getter_1 = operator.itemgetter(1)
index_getter_2 = operator.itemgetter(3, 4)
index_getter_1(l) # => 20
index_getter_2(l) # => (40, 50)
tuples = [('x',10), ('y',20), ('z',30), ('a',40), ('b', 50)]
tuple_getter = operator.itemgetter(1)
list(map(tuple_getter, tuples)) # => [10, 20, 30, 40, 50]
operator.methodcaller(name, /, *args, **kwargs) メソッドへのアクセス
class SampleClass:
def sample_method(self,*args, **kwds):
print(args)
print(kwds)
sc = SampleClass()
caller = operator.methodcaller('sample_method', 10, 'abc', key1=123, key2='X')
caller(sc) # => (10, 'abc') {'key1': 123, 'key2': 'X'}
演算子と関数の対応
演算子と関数の対応は以下の通りです。
例えば、a + b
はoperator.add(a, b)
に対応します。
互換性のために残されている二重アンダースコア付きのメソッドoperator.__add__(a, b)
が提供されているものもあります。
ミュータブルなオブジェクトに対しては、 演算の計算と代入を行うインプレース(in-place)なメソッド・演算子を使用できます。
演算 | 操作 | 関数 | 操作(インプレース) | 関数(インプレース) |
---|---|---|---|---|
加算 | a + b | add(a, b) | a += b | iadd(a, b) |
結合 | seq1 + seq2 | concat(seq1, seq2) | a += b | iconcat(a, b) |
包含判定 | obj in seq | contains(seq, obj) | ||
除算 | a / b | truediv(a, b) | a /= b | itruediv(a, b) |
除算 | a // b | floordiv(a, b) | a //= b | ifloordiv(a, b) |
ビット単位論理積 | a & b | and_(a, b) | a &= b | iand(a, b) |
ビット単位排他的論理和 | a ^ b | xor(a, b) | a ^= b | ixor(a, b) |
ビット単位反転 | ~ a | invert(a) | ||
ビット単位論理和 | a | b | or_(a, b) | a |= b | ior(a, b) |
冪乗 | a ** b | pow(a, b) | a **= b | ipow(a, b) |
同一性 | a is b | is_(a, b) | ||
同一性 | a is not b | is_not(a, b) | ||
インデクス指定の代入 | obj[k] = v | setitem(obj, k, v) | ||
インデクス指定の削除 | del obj[k] | delitem(obj, k) | ||
インデクス指定 | obj[k] | getitem(obj, k) | ||
左シフト | a « b | lshift(a, b) | a «= b | ilshift(a, b) |
剰余 | a % b | mod(a, b) | a %= b | imod(a, b) |
乗算 | a * b | mul(a, b) | a *= b | imul(a, b) |
行列の乗算 | a @ b | matmul(a, b) | a @= b | imatmul(a, b) |
(算術) 負 | - a | neg(a) | ||
(論理) 否 | not a | not_(a) | ||
正 | + a | pos(a) | ||
右シフト | a » b | rshift(a, b) | a »= b | irshift(a, b) |
スライス指定の代入 | seq[i:j] = values | setitem(seq, slice(i, j), values) | ||
スライス指定の削除 | del seq[i:j] | delitem(seq, slice(i, j)) | ||
スライス指定 | seq[i:j] | getitem(seq, slice(i, j)) | ||
文字列書式化 | s % obj | mod(s, obj) | ||
減算 | a - b | sub(a, b) | a -= b | isub(a, b) |
真理値判定 | obj | truth(obj) | ||
順序付け | a < b | lt(a, b) | ||
順序付け | a <= b | le(a, b) | ||
等価性 | a == b | eq(a, b) | ||
不等性 | a != b | ne(a, b) | ||
順序付け | a >= b | ge(a, b) | ||
順序付け | a > b | gt(a, b) |