operator --- 関数形式の標準演算子¶
ソースコード: Lib/operator.py
The operator module exports a set of efficient functions corresponding to
the intrinsic operators of Python. For example, operator.add(x, y) is
equivalent to the expression x+y. Many function names are those used for
special methods, without the double underscores. For backward compatibility,
many of these have a variant with the double underscores kept. The variants
without the double underscores are preferred for clarity.
これらの関数は、オブジェクト比較、論理演算、数学演算、シーケンス演算をするものに分類されます。
オブジェクト比較関数は全てのオブジェクトで有効で、関数の名前はサポートする拡張比較演算子からとられています:
- 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と等価です。これらの関数はどのような値を返してもよく、ブール値として解釈できてもできなくてもかまいません。拡張比較の詳細については 比較 を参照してください。
論理演算もまた全てのオブジェクトに対して適用でき、真理値判定、同一性判定およびブール演算をサポートします:
- operator.not_(obj)¶
- operator.__not__(obj)¶
notobj の結果を返します。(オブジェクトインスタンスには__not__()メソッドは無いので注意してください; インタープリターコアがこの演算を定義しているだけです。結果は__bool__()および__len__()メソッドに影響されます。)
- operator.is_(a, b)¶
a is bを返します。オブジェクトの同一性を判定します。
- operator.is_not(a, b)¶
a is not bを返します。オブジェクトの同一性を判定します。
- operator.is_none(a)¶
Return
a is None. Tests object identity.Added in version 3.14.
- operator.is_not_none(a)¶
Return
a is not None. Tests object identity.Added in version 3.14.
演算子で最も多いのは数学演算およびビット単位の演算です:
- operator.index(a)¶
- operator.__index__(a)¶
整数に変換された a を返します。
a.__index__()と同等です。バージョン 3.10 で変更: 結果は常に厳密な
int型です。 以前は、結果はintのサブクラスのインスタンスのこともありました。
- operator.inv(obj)¶
- operator.invert(obj)¶
- operator.__inv__(obj)¶
- operator.__invert__(obj)¶
obj のビット単位反転を返します。
~objと同じです。
- operator.truediv(a, b)¶
- operator.__truediv__(a, b)¶
2/3 が 0 ではなく 0.66 となるような
a / bを返します。 "真の" 除算としても知られています。
シーケンスを扱う演算子(いくつかの演算子はマッピングも扱います)には以下のようなものがあります:
- operator.countOf(a, b)¶
a の中に b が出現する回数を返します。
- operator.indexOf(a, b)¶
a で最初に b が出現する場所のインデクスを返します。
- operator.length_hint(obj, default=0)¶
オブジェクト obj の概算の長さを返します。最初に実際の長さを、次に
object.__length_hint__()を使って概算の長さを、そして最後にデフォルトの値を返そうとします。Added in version 3.4.
次の操作は呼び出し可能オブジェクト (callable) で動作します。
- operator.call(obj, /, *args, **kwargs)¶
- operator.__call__(obj, /, *args, **kwargs)¶
obj(*args, **kwargs)を返します。Added in version 3.11.
The operator module also defines tools for generalized attribute and item
lookups. These are useful for making fast field extractors as arguments for
map(), sorted(), itertools.groupby(), or other functions that
expect a function argument.
- 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 any(not isinstance(item, str) for item in items): raise TypeError('attribute name must be a string') 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
- 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' >>> soldier = dict(rank='captain', name='dotterbart') >>> itemgetter('rank')(soldier) 'captain'
itemgetter()を使って特定のフィールドをタプルレコードから取り出す例:>>> inventory = [('apple', 3), ('banana', 2), ('pear', 5), ('orange', 1)] >>> getcount = itemgetter(1) >>> list(map(getcount, inventory)) [3, 2, 5, 1] >>> sorted(inventory, key=getcount) [('orange', 1), ('banana', 2), ('apple', 3), ('pear', 5)]
- operator.methodcaller(name, /, *args, **kwargs)¶
引数の 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
演算子から関数への対応表¶
This table shows how abstract operations correspond to operator symbols in the
Python syntax and the functions in the operator module.
演算 |
操作 |
関数 |
|---|---|---|
加算 |
|
|
結合 |
|
|
包含判定 |
|
|
除算 |
|
|
除算 |
|
|
ビット単位論理積 |
|
|
ビット単位排他的論理和 |
|
|
ビット単位反転 |
|
|
ビット単位論理和 |
|
|
冪乗 |
|
|
同一性 |
|
|
同一性 |
|
|
同一性 |
|
|
同一性 |
|
|
インデクス指定の代入 |
|
|
インデクス指定の削除 |
|
|
インデクス指定 |
|
|
左シフト |
|
|
剰余 |
|
|
乗算 |
|
|
行列の乗算 |
|
|
(算術) 負 |
|
|
(論理) 否 |
|
|
正 |
|
|
右シフト |
|
|
スライス指定の代入 |
|
|
スライス指定の削除 |
|
|
スライス指定 |
|
|
文字列書式化 |
|
|
減算 |
|
|
真理値判定 |
|
|
順序付け |
|
|
順序付け |
|
|
等価性 |
|
|
不等性 |
|
|
順序付け |
|
|
順序付け |
|
|
インプレース (in-place) 演算子¶
多くの演算に「インプレース」版があります。 以下の関数はそうした演算子の通常の文法に比べてより素朴な呼び出し方を提供します。たとえば、 文 x += y は x = operator.iadd(x, y) と等価です。別の言い方をすると、 z = operator.iadd(x, y) は複合文 z = x; z += y と等価です。
なお、これらの例では、インプレースメソッドが呼び出されたとき、計算と代入は二段階に分けて行われます。以下に挙げるインプレース関数は、インプレースメソッドを呼び出してその第一段階だけを行います。第二段階の代入は扱われません。
文字列、数、タプルのようなイミュータブルなターゲットでは、更新された値が計算されますが、入力変数に代入し返されはしません。
>>> a = 'hello'
>>> iadd(a, ' world')
'hello world'
>>> a
'hello'
リストや辞書のようなミュータブルなターゲットでは、インプレースメソッドは更新を行うので、その後に代入をする必要はありません。
>>> s = ['h', 'e', 'l', 'l', 'o']
>>> iadd(s, [' ', 'w', 'o', 'r', 'l', 'd'])
['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
>>> s
['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
- operator.iconcat(a, b)¶
- operator.__iconcat__(a, b)¶
a = iconcat(a, b)は二つのシーケンス a と b に対しa += bと等価です。