# 7 `operator` -- 関数形式の標準演算子

`operator` モジュールは、Python 固有の各演算子に対応している C 言語で実装された関数セットを提供します。例えば、 `operator.add(x, y)` は式 `x+y` と等価です。関数名は 特殊なクラスメソッドとして扱われます; 便宜上、先頭と末尾の "`__`" を取り除いたものも提供されています。

これらの関数はそれぞれ、オブジェクトの比較、論理演算、数学演算、 シーケンス操作、および抽象型テストに分類されます。

オブジェクト比較関数は全てのオブジェクトで有効で、関数の名前は サポートする大小比較演算子からとられています:

`lt`( | a, b)

`le`( | a, b)

`eq`( | a, b)

`ne`( | a, b)

`ge`( | a, b)

`gt`( | a, b)

`__lt__`( | a, b)

`__le__`( | a, b)

`__eq__`( | a, b)

`__ne__`( | a, b)

`__ge__`( | a, b)

`__gt__`( | a, b)

  これらは a および b の大小比較を行います。 特に、 `lt(a, b)` は `a < b`、 `le(a, b)` は `a <= b`、 `eq(a, b)` は `a == b`、 `ne(a, b)` は `a != b`、 `gt(a, b)` は `a > b`、 そして `ge(a, b)` は `a >= b` と等価です。

  組み込み関数 `cmp()` と違って、これらの関数はどのような 値を返してもよく、ブール代数値として解釈できてもできなくても かまいません。大小比較の詳細については Python リファレンスマニュアル を参照してください。 バージョン 2.2 で 新たに追加 された仕様です。

論理演算もまた全てのオブジェクトに対して適用することができ、 真値テスト、同一性テストおよびブール演算をサポートします:

`not_`( | o)

`__not__`( | o)

  `not` o の結果を返します。(オブジェクトのインスタンス には `__not__()` メソッドは適用されないので注意してください; この操作を定義しているのはインタプリタコアだけです。結果は `__nonzero__()` および `__len__()` メソッドによって 影響されます。)

`truth`( | o)

  o が真の場合 `True` を返し、そうでない場合 `False` を返します。この関数は`bool`のコンストラクタ呼び出しと同等です。

`is_`( | a, b)

  `a is b` を返します。オブジェクトの同一性をテストします。

`is_not`( | a, b)

  `a is not b` を返します。オブジェクトの同一性をテストします。

演算子で最も多いのは数学演算およびビット単位の演算です:

`abs`( | o)

`__abs__`( | o)

  o の絶対値を返します。

`add`( | a, b)

`__add__`( | a, b)

  数値 a および b について a `+` b を 返します。

`and_`( | a, b)

`__and__`( | a, b)

  a と b の論理積を返します。

`div`( | a, b)

`__div__`( | a, b)

  `__future__.division` が有効でない場合には a `/` b を返します。``古い(classic)'' 除算としても知られています。

`floordiv`( | a, b)

`__floordiv__`( | a, b)

  a `//` b を返します。 バージョン 2.2 で 新たに追加 された仕様です。

`inv`( | o)

`invert`( | o)

`__inv__`( | o)

`__invert__`( | o)

  o のビット単位反転を返します。`~`o と 同じです。Python 2.0 では名前 `invert()` および `__invert__()` が追加されました。

`lshift`( | a, b)

`__lshift__`( | a, b)

  a の b ビット左シフトを返します。

`mod`( | a, b)

`__mod__`( | a, b)

  a `%` b を返します。

`mul`( | a, b)

`__mul__`( | a, b)

  数値 a および b について a `*` b を返します。

`neg`( | o)

`__neg__`( | o)

  o の符号反転を返します。

`or_`( | a, b)

`__or__`( | a, b)

  a と b の論理和を返します。

`pos`( | o)

`__pos__`( | o)

  o の符号非反転を返します。

`pow`( | a, b)

`__pow__`( | a, b)

  数値 a および b について a `**` b を返します。 バージョン 2.3 で 新たに追加 された仕様です。

`rshift`( | a, b)

`__rshift__`( | a, b)

  a の b ビット右シフトを返します。

`sub`( | a, b)

`__sub__`( | a, b)

  a `-` b を返します。

`truediv`( | a, b)

`__truediv__`( | a, b)

  `__future__.division` が有効な場合 a `/` b を返します。``真の''除算としても知られています。 バージョン 2.2 で 新たに追加 された仕様です。

`xor`( | a, b)

`__xor__`( | a, b)

  a および b の排他的論理和を返します。

`index`( | a)

`__index__`( | a)

  整数に変換された a を返します。 a`.__index__()` と同等です。 バージョン 2.5 で 新たに追加 された仕様です。

シーケンスを扱う演算子には以下のようなものがあります:

`concat`( | a, b)

`__concat__`( | a, b)

  シーケンス a および b について a `+` b を返します。

`contains`( | a, b)

`__contains__`( | a, b)

  b `in` a を調べた結果を返します。 演算対象が左右反転しているので注意してください。関数名 `__contains__()` は Python 2.0 で追加されました。

`countOf`( | a, b)

  a の中に b が出現する回数を返します。

`delitem`( | a, b)

`__delitem__`( | a, b)

  a でインデクスが b の要素を削除します。

`delslice`( | a, b, c)

`__delslice__`( | a, b, c)

  a でインデクスが b から c`-1` のスライス要素を 削除します。

`getitem`( | a, b)

`__getitem__`( | a, b)

  a でインデクスが b の要素を返します。

`getslice`( | a, b, c)

`__getslice__`( | a, b, c)

  a でインデクスが b から c`-1` のスライス要素を 返します。

`indexOf`( | a, b)

  a で最初に b が出現する場所のインデクスを返します。

`repeat`( | a, b)

`__repeat__`( | a, b)

  シーケンス a と整数 b について a `*` b を返します。

`sequenceIncludes`( | ...)

  リリース 2.0 で撤廃されました。 `contains()` を使ってください。

  `contains()` の別名です。

`setitem`( | a, b, c)

`__setitem__`( | a, b, c)

  a でインデクスが b の要素の値を c に設定します。

`setslice`( | a, b, c, v)

`__setslice__`( | a, b, c, v)

  a でインデクスが b から c`-1` のスライス要素の 値をシーケンス v に設定します。

多くの演算に「その場」バージョンがあります。 以下の関数はそうした演算子の通常の文法に比べてより素朴な呼び出し方を提供します。 たとえば、文 `x += y` は `x = operator.iadd(x, y)` と等価です。 別の言い方をすると、`z = operator.iadd(x, y)` は複合文 `z = x; z += y` と等価です。

`iadd`( | a, b)

`__iadd__`( | a, b)

  `a = iadd(a, b)` は `a += b` と等価です。 バージョン 2.5 で 新たに追加 された仕様です。

`iand`( | a, b)

`__iand__`( | a, b)

  `a = iand(a, b)` は `a &= b` と等価です。 バージョン 2.5 で 新たに追加 された仕様です。

`iconcat`( | a, b)

`__iconcat__`( | a, b)

  `a = iconcat(a, b)` は二つのシーケンス a と b に対し `a += b` と等価です。 バージョン 2.5 で 新たに追加 された仕様です。

`idiv`( | a, b)

`__idiv__`( | a, b)

  `a = idiv(a, b)` は `__future__.division` が有効でないときに `a /= b` と等価です。 バージョン 2.5 で 新たに追加 された仕様です。

`ifloordiv`( | a, b)

`__ifloordiv__`( | a, b)

  `a = ifloordiv(a, b)` は `a //= b` と等価です。 バージョン 2.5 で 新たに追加 された仕様です。

`ilshift`( | a, b)

`__ilshift__`( | a, b)

  `a = ilshift(a, b)` は `a <``<= b` と等価です。 バージョン 2.5 で 新たに追加 された仕様です。

`imod`( | a, b)

`__imod__`( | a, b)

  `a = imod(a, b)` は `a %= b` と等価です。 バージョン 2.5 で 新たに追加 された仕様です。

`imul`( | a, b)

`__imul__`( | a, b)

  `a = imul(a, b)` は `a *= b` と等価です。 バージョン 2.5 で 新たに追加 された仕様です。

`ior`( | a, b)

`__ior__`( | a, b)

  `a = ior(a, b)` は `a |= b` と等価です。 バージョン 2.5 で 新たに追加 された仕様です。

`ipow`( | a, b)

`__ipow__`( | a, b)

  `a = ipow(a, b)` は `a **= b` と等価です。 バージョン 2.5 で 新たに追加 された仕様です。

`irepeat`( | a, b)

`__irepeat__`( | a, b)

  `a = irepeat(a, b)` は a がシーケンスで b が整数であるとき `a *= b` と等価です。 バージョン 2.5 で 新たに追加 された仕様です。

`irshift`( | a, b)

`__irshift__`( | a, b)

  `a = irshift(a, b)` は `a »= b` と等価です。 バージョン 2.5 で 新たに追加 された仕様です。

`isub`( | a, b)

`__isub__`( | a, b)

  `a = isub(a, b)` は `a -= b` と等価です。 バージョン 2.5 で 新たに追加 された仕様です。

`itruediv`( | a, b)

`__itruediv__`( | a, b)

  `a = itruediv(a, b)` は `__future__.division` が有効なときに `a /= b` と等価です。 バージョン 2.5 で 新たに追加 された仕様です。

`ixor`( | a, b)

`__ixor__`( | a, b)

  `a = ixor(a, b)` は `a ^= b` と等価です。 バージョン 2.5 で 新たに追加 された仕様です。

`operator` モジュールでは、オブジェクトの型を調べるための 述語演算子も定義しています。注意: これらの関数が返す結果について 誤って理解しないよう注意してください; インスタンスオブジェクトに 対して常に信頼できる値を返すのは `isCallable()` だけです。例えば以下のようになります:

    >>> class C:
    ...     pass
    ...
    >>> import operator
    >>> o = C()
    >>> operator.isMappingType(o)
    True

`isCallable`( | o)

  リリース 2.0 で撤廃されました。 `callable()` を使ってください。

  オブジェクト o を関数のように呼び出すことができる場合真を 返し、それ以外の場合 false を返します。関数、バインドおよび非バインド メソッド、クラスオブジェクト、および `__call__()` メソッド をサポートするインスタンスオブジェクトは真を返します。

`isMappingType`( | o)

  オブジェクト o がマップ型インタフェースをサポートする場合に真を返します。 辞書および `__getitem__` メソッドが定義された全てのインスタンスオブジェクトに対しては、この値は真になります。 警告: インタフェース自体が誤った定義になっているため、 あるインスタンスが完全なマップ型プロトコルを備えているかを調べる信頼性のある方法は 存在しません。このため、この関数によるテストはさほど便利ではありません。

`isNumberType`( | o)

  オブジェクト o が数値を表現している場合に真を返します。 C で実装された全ての数値型対して、この値は真になります。 警告: インタフェース自体が誤った定義になっているため、 あるインスタンスが完全な数値型のインタフェースをサポートしているかを調べる信頼性のある方法は存在 しません。このため、この関数によるテストはさほど便利ではありません。

`isSequenceType`( | o)

  o がシーケンス型プロトコルをサポートする場合に真を返します。 シーケンス型メソッドを C で定義している全てのオブジェクトおよび `__getitem__` メソッドが定義された全てのインスタンスオブジェクト に対して、この値は真になります。 警告: インタフェース自体が誤った定義になっているため、 あるインスタンスが完全なシーケンス型のインタフェースをサポートしているかを調べる信頼性のある方法は存在 しません。このため、この関数によるテストはさほど便利ではありません。

例: `0` から `255` までの序数を文字に対応付ける 辞書を構築します。

    >>> import operator
    >>> d = {}
    >>> keys = range(256)
    >>> vals = map(chr, keys)
    >>> map(operator.setitem, [d]*len(keys), keys, vals)

`operator` モジュールはアトリビュートとアイテムの汎用的な検索 のための道具も定義しています。 `map()`, `sorted()`, `itertools.groupby()`, や関数を引数に取るその他の関数に対して高速にフィールドを抽出する際に 引数として使うと便利です。

`attrgetter`( | attr[, args...])

  演算対象から attr を取得する呼び出し可能なオブジェクトを返します。 二つ以上のアトリビュートを要求された場合には、アトリビュートのタプルを返します。 "`f=attrgetter('name')`" とした後で、"`f(b)`" を呼び出すと "`b.name`" を返します。 "`f=attrgetter('name', 'date')`" とした後で、 "`f(b)`" を呼び出すと "`(b.name, b.date)`" を返します。 バージョン 2.4 で 新たに追加 された仕様です。 バージョン 2.5 で 変更 された仕様: 複数のアトリビュートがサポートされました

`itemgetter`( | item[, args...])

  演算対象から item を取得する呼び出し可能なオブジェクトを返します。 二つ以上のアイテムを要求された場合には、アイテムのタプルを返します。 "`f=itemgetter(2)`" とした後で、 "`f(b)`" を呼び出すと "`b[2]`" を返します。 "`f=itemgetter(2,5,3)`" とした後で、 "`f(b)`" を呼び出すと "`(b[2], b[5], b[3])`" を返します。 バージョン 2.4 で 新たに追加 された仕様です。 バージョン 2.5 で 変更 された仕様: 複数のアトリビュートがサポートされました

例:

    >>> from operator import itemgetter
    >>> inventory = [('apple', 3), ('banana', 2), ('pear', 5), ('orange', 1)]
    >>> getcount = itemgetter(1)
    >>> map(getcount, inventory)
    [3, 2, 5, 1]
    >>> sorted(inventory, key=getcount)
    [('orange', 1), ('banana', 2), ('apple', 3), ('pear', 5)]