# 10 `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 の排他的論理和を返します

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

`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 の要素を削除します。 Return the value of a at index 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 に設定します。

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

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

`isCallable`( | o)

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

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

`isMappingType`( | o)

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

`isNumberType`( | o)

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

`isSequenceType`( | o)

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

例: `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)

  演算子から attr を取得する呼び出し可能なオブジェクトを返します。 "`f=attrgetter('name')`" とした後で、"`f(b)`" を呼び出すと "`b.name`" を返します。

  バージョン 2.4 で 新たに追加 された仕様です。

`itemgetter`( | item)

  演算子から item を取得する呼び出し可能なオブジェクトを返します。 "`f=itemgetter(2)`" とした後で, "`f(b)`" を呼び出すと "`b[2]`" を返します。

  バージョン 2.4 で 新たに追加 された仕様です。

例:

    >>> from operator import *
    >>> 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)]