9.9. operator --- 関数形式の標準演算子¶
operator モジュールは、Python の組み込み演算子に対応する効率的な関数群を提供します。例えば、 operator.add(x, y) は式 x+y と等価です。関数の名前は、特殊クラスメソッドに使われている名前と同じです; 便宜上、先頭と末尾の __ を取り除いたものも提供されています。
これらの関数はそれぞれ、オブジェクト比較、論理演算、数学演算、シーケンス操作、および抽象型テストに分類されます。
オブジェクト比較関数は全てのオブジェクトで有効で、関数の名前はサポートする拡張比較演算子からとられています:
-
operator.lt(a, b)¶ -
operator.le(a, b)¶ -
operator.eq(a, b)¶ -
operator.ne(a, b)¶ -
operator.ge(a, b)¶ -
operator.gt(a, b)¶ -
operator.__lt__(a, b)¶ -
operator.__le__(a, b)¶ -
operator.__eq__(a, b)¶ -
operator.__ne__(a, b)¶ -
operator.__ge__(a, b)¶ -
operator.__gt__(a, b)¶ a と b の "拡張比較 (rich comparisons)" を行います。具体的には、
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()と違って、これらの関数はどのような値を返してもよく、ブール値として解釈できてもできなくてもかまいません。拡張比較の詳細については 比較 を参照してください。バージョン 2.2 で追加.
論理演算もまた全てのオブジェクトに対して適用でき、真理値判定、同一性判定およびブール演算をサポートします:
-
operator.not_(obj)¶ -
operator.__not__(obj)¶ notobj の結果を返します。(オブジェクトインスタンスには__not__()メソッドは無いので注意してください; インタプリタコアがこの演算を定義しているだけです。結果は__nonzero__()および__len__()メソッドに影響されます。)
-
operator.is_(a, b)¶ a is bを返します。オブジェクトの同一性を判定します。バージョン 2.3 で追加.
-
operator.is_not(a, b)¶ a is not bを返します。オブジェクトの同一性を判定します。バージョン 2.3 で追加.
演算子で最も多いのは数学演算およびビット単位の演算です:
-
operator.div(a, b)¶ -
operator.__div__(a, b)¶ __future__.divisionが有効でなければ、a / bはa // bと同じ結果を返します。これは "古典的な (classic)" 除算とも呼ばれます。
-
operator.inv(obj)¶ -
operator.invert(obj)¶ -
operator.__inv__(obj)¶ -
operator.__invert__(obj)¶ obj のビット単位反転を返します。
~objと同じです。バージョン 2.0 で追加: 名前
invert()および__invert__()が追加されました。
-
operator.truediv(a, b)¶ -
operator.__truediv__(a, b)¶ __future__.divisionが有効な場合a / bを返します。 "真の" 除算としても知られています。バージョン 2.2 で追加.
シーケンスを扱う演算子(いくつかの演算子はマッピングも扱います)には以下のようなものがあります:
-
operator.contains(a, b)¶ -
operator.__contains__(a, b)¶ b in aの判定結果を返します。被演算子が左右反転しているので注意してください。バージョン 2.0 で追加: 関数名
__contains__()が追加されました。
-
operator.countOf(a, b)¶ a の中に b が出現する回数を返します。
-
operator.delslice(a, b, c)¶ -
operator.__delslice__(a, b, c)¶ a でインデクスが b から c-1 のスライス要素を削除します。
バージョン 2.6 で非推奨: この関数は Python 3.x で削除されます。
delitem()をスライスインデクスで使って下さい。
-
operator.getslice(a, b, c)¶ -
operator.__getslice__(a, b, c)¶ a でインデクスが b から c-1 のスライス要素を返します。
バージョン 2.6 で非推奨: この関数は Python 3.x で削除されます。
getitem()をスライスインデクスで使って下さい。
-
operator.indexOf(a, b)¶ a で最初に b が出現する場所のインデクスを返します。
-
operator.repeat(a, b)¶ -
operator.__repeat__(a, b)¶ バージョン 2.7 で非推奨: 代わりに
__mul__()を使ってください。シーケンス a と整数 b について
a * bを返します。
-
operator.sequenceIncludes(...)¶ バージョン 2.0 で非推奨: 代わりに
contains()を使ってください。contains()の別名です。
-
operator.setslice(a, b, c, v)¶ -
operator.__setslice__(a, b, c, v)¶ a でインデクスが b から c-1 のスライス要素の値をシーケンス v に設定します。
バージョン 2.6 で非推奨: この関数は Python 3.x で削除されます。
setitem()をスライスインデクスで使って下さい。
operator の関数を使う例を挙げます:
>>> # Elementwise multiplication
>>> map(mul, [0, 1, 2, 3], [10, 20, 30, 40])
[0, 20, 60, 120]
>>> # Dot product
>>> sum(map(mul, [0, 1, 2, 3], [10, 20, 30, 40]))
200
多くの演算に「インプレース」版があります。 以下の関数はそうした演算子の通常の文法に比べてより素朴な呼び出し方を提供します。たとえば、文(statement) x += y は x = operator.iadd(x, y) と等価です。別の言い方をすると、 z = operator.iadd(x, y) は複合文 z = x; z += y と等価です。
-
operator.iconcat(a, b)¶ -
operator.__iconcat__(a, b)¶ a = iconcat(a, b)は二つのシーケンス a と b に対しa += bと等価です。バージョン 2.5 で追加.
-
operator.idiv(a, b)¶ -
operator.__idiv__(a, b)¶ a = idiv(a, b)は__future__.divisionが有効でないときにa /= bと等価です。バージョン 2.5 で追加.
-
operator.ifloordiv(a, b)¶ -
operator.__ifloordiv__(a, b)¶ a = ifloordiv(a, b)はa //= bと等価です。バージョン 2.5 で追加.
-
operator.ilshift(a, b)¶ -
operator.__ilshift__(a, b)¶ a = ilshift(a, b)はa <<= bと等価です。バージョン 2.5 で追加.
-
operator.irepeat(a, b)¶ -
operator.__irepeat__(a, b)¶ バージョン 2.7 で非推奨: 代わりに
__imul__()を使ってください。a = irepeat(a, b)は a がシーケンスで b が整数であるときa *= bと等価です。バージョン 2.5 で追加.
-
operator.irshift(a, b)¶ -
operator.__irshift__(a, b)¶ a = irshift(a, b)はa >>= bと等価です。バージョン 2.5 で追加.
-
operator.itruediv(a, b)¶ -
operator.__itruediv__(a, b)¶ a = itruediv(a, b)は__future__.divisionが有効なときにa /= bと等価です。バージョン 2.5 で追加.
operator モジュールでは、オブジェクトの型を調べるための述語演算子も定義しています。しかしながらこれらはいつでも信頼できるというわけではありません。代わりに抽象基底クラスをテストするのが望ましい方法です (詳しくは collections や numbers を参照して下さい)。
-
operator.isCallable(obj)¶ バージョン 2.0 で非推奨: 代わりに
isinstance(x, collections.Callable)を使ってください。オブジェクト obj を関数のように呼び出すことができる場合真を返し、それ以外の場合偽を返します。関数、束縛および非束縛メソッド、クラスオブジェクト、および
__call__()メソッドをサポートするインスタンスオブジェクトに対しては真を返します。
-
operator.isMappingType(obj)¶ バージョン 2.7 で非推奨: 代わりに
isinstance(x, collections.Mapping)を使ってください。オブジェクト obj がマップ型インタフェースをサポートする場合に真を返します。辞書および
__getitem__()メソッドが定義された全てのインスタンスオブジェクトに対しては、この値は真になります。
-
operator.isNumberType(obj)¶ バージョン 2.7 で非推奨: 代わりに
isinstance(x, numbers.Number)を使ってください。オブジェクト obj が数値を表現している場合に真を返します。 C で実装された全ての数値型対して、この値は真になります。
-
operator.isSequenceType(obj)¶ バージョン 2.7 で非推奨: 代わりに
isinstance(x, collections.Sequence)使ってください。obj がシーケンス型プロトコルをサポートする場合に真を返します。シーケンス型メソッドを C で定義している全てのオブジェクトおよび
__getitem__()メソッドが定義された全てのインスタンスオブジェクトに対して、この値は真になります。
operator モジュールは属性とアイテムの汎用的な検索のための道具も定義しています。 map(), sorted(), itertools.groupby(), や関数を引数に取るその他の関数に対して高速にフィールドを抽出する際に引数として使うと便利です。
-
operator.attrgetter(attr)¶ -
operator.attrgetter(*attrs) 演算対象から attr を取得する呼び出し可能なオブジェクトを返します。二つ以上の属性を要求された場合には、属性のタプルを返します。属性名はドットを含むこともできます。例えば:
f = attrgetter('name')とした後で、f(b)を呼び出すとb.nameを返します。f = attrgetter('name', 'date')とした後で、f(b)を呼び出すと(b.name, b.date)を返します。f = attrgetter('name.first', 'name.last')とした後で、f(b)を呼び出すと(b.name.first, b.name.last)を返します。
次と等価です:
def attrgetter(*items): if len(items) == 1: attr = items[0] def g(obj): return resolve_attr(obj, attr) else: def g(obj): return tuple(resolve_attr(obj, attr) for attr in items) return g def resolve_attr(obj, attr): for name in attr.split("."): obj = getattr(obj, name) return obj
バージョン 2.4 で追加.
バージョン 2.5 で変更: 複数のアトリビュートがサポートされました。
バージョン 2.6 で変更: ドット付きアトリビュートがサポートされました。
-
operator.itemgetter(item)¶ -
operator.itemgetter(*items) 演算対象からその
__getitem__()メソッドを使って item を取得する呼び出し可能なオブジェクトを返します。 二つ以上のアイテムを要求された場合には、アイテムのタプルを返します。例えば:f = itemgetter(2)とした後で、f(r)を呼び出すとr[2]を返します。g = itemgetter(2, 5, 3)とした後で、g(r)を呼び出すと(r[2], r[5], r[3])を返します。
次と等価です:
def itemgetter(*items): if len(items) == 1: item = items[0] def g(obj): return obj[item] else: def g(obj): return tuple(obj[item] for item in items) return g
アイテムは被演算子の
__getitem__()メソッドが受け付けるどんな型でも構いません。辞書ならば任意のハッシュ可能な値を受け付けます。リスト、タプル、文字列などはインデクスかスライスを受け付けます:>>> itemgetter(1)('ABCDEFG') 'B' >>> itemgetter(1,3,5)('ABCDEFG') ('B', 'D', 'F') >>> itemgetter(slice(2,None))('ABCDEFG') 'CDEFG'
バージョン 2.4 で追加.
バージョン 2.5 で変更: 複数アイテム抽出がサポートされました.
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)]
-
operator.methodcaller(name[, args...])¶ 引数の name メソッドを呼び出す呼び出し可能オブジェクトを返します。追加の引数および/またはキーワード引数が与えられると、これらもそのメソッドに引き渡されます。例えば:
f = methodcaller('name')とした後で、f(b)を呼び出すとb.name()を返します。f = methodcaller('name', 'foo', bar=1)とした後で、f(b)を呼び出すとb.name('foo', bar=1)を返します。
次と等価です:
def methodcaller(name, *args, **kwargs): def caller(obj): return getattr(obj, name)(*args, **kwargs) return caller
バージョン 2.6 で追加.
9.9.1. 演算子から関数への対応表¶
下のテーブルでは、個々の抽象的な操作が、どのように Python 構文上の各演算子や operator モジュールの関数に対応しているかを示しています。
演算 |
操作 |
関数 |
|---|---|---|
加算 |
|
|
結合 |
|
|
包含判定 |
|
|
除算 |
|
|
除算 |
|
|
除算 |
|
|
ビット単位論理積 |
|
|
ビット単位排他的論理和 |
|
|
ビット単位反転 |
|
|
ビット単位論理和 |
|
|
べき乗 |
|
|
同一性 |
|
|
同一性 |
|
|
インデクス指定の代入 |
|
|
インデクス指定の削除 |
|
|
インデクス指定 |
|
|
左シフト |
|
|
剰余 |
|
|
乗算 |
|
|
(算術) 負 |
|
|
(論理) 否 |
|
|
正 |
|
|
右シフト |
|
|
シーケンスの反復 |
|
|
スライス指定の代入 |
|
|
スライス指定の削除 |
|
|
スライス指定 |
|
|
文字列書式化 |
|
|
減算 |
|
|
真理値判定 |
|
|
順序付け |
|
|
順序付け |
|
|
等価性 |
|
|
不等性 |
|
|
順序付け |
|
|
順序付け |
|
|
