2021-04-11に投稿

Python 標準ライブラリ operator 演算

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 + boperator.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
剰余 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
等価性 a == b eq(a, b)
不等性 a != b ne(a, b)
順序付け a >= b ge(a, b)
順序付け a > b gt(a, b)
Originally published at marusankakusikaku.jp
ツイッターでシェア
みんなに共有、忘れないようにメモ

maru3kaku4kaku

Pythonこつこつ学習中。よく忘れる。

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント