9.9。 オペレーター —関数としての標準演算子
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 の間で「豊富な比較」を実行します。 具体的には、
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の新機能。
論理演算は一般にすべてのオブジェクトに適用可能であり、真理検定、ID検定、およびブール演算をサポートします。
- operator.not_(obj)
operator.__not__(obj)
- not obj の結果を返します。 (オブジェクトインスタンスには __ not __()メソッドがないことに注意してください。この操作を定義するのはインタープリターコアのみです。 結果は、
__nonzero__()
および__len__()
メソッドの影響を受けます。)
- operator.is_(a, b)
a is b
を返します。 オブジェクトのIDをテストします。バージョン2.3の新機能。
- operator.is_not(a, b)
a is not b
を返します。 オブジェクトのIDをテストします。バージョン2.3の新機能。
数学演算とビット演算が最も多くあります。
- operator.abs(obj)
operator.__abs__(obj)
- obj の絶対値を返します。
- operator.add(a, b)
operator.__add__(a, b)
- a および b 番号の場合、
a + b
を返します。
- operator.and_(a, b)
operator.__and__(a, b)
- a と b のビット単位を返します。
- operator.div(a, b)
operator.__div__(a, b)
__future__.division
が有効でない場合は、a / b
を返します。 これは「クラシック」部門としても知られています。
- operator.floordiv(a, b)
operator.__floordiv__(a, b) a // b
を返します。バージョン2.2の新機能。
- operator.index(a)
operator.__index__(a) 整数に変換された a を返します。
a.__index__()
と同等です。バージョン2.5の新機能。
- operator.inv(obj)
operator.invert(obj)
operator.__inv__(obj)
operator.__invert__(obj) 数値 obj のビット単位の逆数を返します。 これは
~obj
と同等です。バージョン2.0の新機能:名前 invert()および __ invert __()。
- operator.lshift(a, b)
operator.__lshift__(a, b)
- a を b だけ左にシフトして返します。
- operator.mod(a, b)
operator.__mod__(a, b)
a % b
を返します。
- operator.mul(a, b)
operator.__mul__(a, b)
- a および b 番号の場合、
a * b
を返します。
- operator.neg(obj)
operator.__neg__(obj)
- 否定された obj を返します(
-obj
)。
- operator.or_(a, b)
operator.__or__(a, b)
- a と b のビット単位またはを返します。
- operator.pos(obj)
operator.__pos__(obj)
- obj を正(
+obj
)で返します。
- operator.pow(a, b)
operator.__pow__(a, b) a および b 番号の場合、
a ** b
を返します。バージョン2.3の新機能。
- operator.rshift(a, b)
operator.__rshift__(a, b)
- a を b だけ右にシフトして返します。
- operator.sub(a, b)
operator.__sub__(a, b)
a - b
を返します。
- operator.truediv(a, b)
operator.__truediv__(a, b) __future__.division
が有効な場合は、a / b
を返します。 これは「真の」除算とも呼ばれます。バージョン2.2の新機能。
- operator.xor(a, b)
operator.__xor__(a, b)
- a と b のビット単位の排他的論理和を返します。
シーケンスを処理する操作(一部はマッピングも使用)には、次のものがあります。
- operator.concat(a, b)
operator.__concat__(a, b)
- a および b シーケンスの
a + b
を返します。
- operator.contains(a, b)
operator.__contains__(a, b) テストの結果を返します
b in a
。 オペランドが逆になっていることに注意してください。バージョン2.0の新機能:名前 __ contains __()。
- operator.countOf(a, b)
- a 内の b の出現回数を返します。
- operator.delitem(a, b)
operator.__delitem__(a, b)
- インデックス b の a の値を削除します。
- operator.delslice(a, b, c)
operator.__delslice__(a, b, c) a のスライスをインデックス b からインデックス c-1 に削除します。
バージョン2.6以降非推奨:この関数はPython3.xで削除されました。 delitem()をスライスインデックスとともに使用します。
- operator.getitem(a, b)
operator.__getitem__(a, b)
- インデックス b の a の値を返します。
- operator.getslice(a, b, c)
operator.__getslice__(a, b, c) a のスライスをインデックス b からインデックス c-1 に返します。
バージョン2.6以降非推奨:この関数はPython3.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()を使用してください。
- operator.setitem(a, b, c)
operator.__setitem__(a, b, c)
- インデックス b の a の値を c に設定します。
- operator.setslice(a, b, c, v)
operator.__setslice__(a, b, c, v) a のスライスをインデックス b からインデックス c-1 のシーケンス v に設定します。
バージョン2.6以降非推奨:この関数はPython3.xで削除されました。 setitem()をスライスインデックスとともに使用します。
演算子関数の使用例:
>>> # 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
多くの操作には「インプレース」バージョンがあります。 次の関数は、通常の構文よりもインプレース演算子へのより基本的なアクセスを提供します。 たとえば、ステートメント x += y
はx = operator.iadd(x, y)
と同等です。 別の言い方をすれば、z = operator.iadd(x, y)
は複合ステートメントz = x; z += y
と同等であると言うことです。
- operator.iadd(a, b)
operator.__iadd__(a, b) a = iadd(a, b)
はa += b
と同等です。バージョン2.5の新機能。
- operator.iand(a, b)
operator.__iand__(a, b) a = iand(a, b)
はa &= b
と同等です。バージョン2.5の新機能。
- 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.imod(a, b)
operator.__imod__(a, b) a = imod(a, b)
はa %= b
と同等です。バージョン2.5の新機能。
- operator.imul(a, b)
operator.__imul__(a, b) a = imul(a, b)
はa *= b
と同等です。バージョン2.5の新機能。
- operator.ior(a, b)
operator.__ior__(a, b) a = ior(a, b)
はa |= b
と同等です。バージョン2.5の新機能。
- operator.ipow(a, b)
operator.__ipow__(a, b) a = ipow(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.isub(a, b)
operator.__isub__(a, b) a = isub(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.ixor(a, b)
operator.__ixor__(a, b) a = ixor(a, b)
はa ^= b
と同等です。バージョン2.5の新機能。
operator モジュールは、オブジェクトのタイプをテストするためのいくつかの述語も定義します。 ただし、これらすべてが信頼できるわけではありません。 代わりに、抽象基本クラスをテストすることをお勧めします(詳細については、コレクションおよび番号を参照してください)。
- operator.isCallable(obj)
バージョン2.0以降非推奨:代わりに
isinstance(x, collections.Callable)
を使用してください。オブジェクト obj を関数のように呼び出すことができる場合はtrueを返し、そうでない場合はfalseを返します。 Trueは、
__call__()
メソッドをサポートする関数、バインドされたメソッドとバインドされていないメソッド、クラスオブジェクト、およびインスタンスオブジェクトに対して返されます。
- operator.isMappingType(obj)
バージョン2.7以降非推奨:代わりに
isinstance(x, collections.Mapping)
を使用してください。オブジェクト obj がマッピングインターフェイスをサポートしている場合はtrueを返します。 これは、 __ getitem __()を定義する辞書およびすべてのインスタンスオブジェクトに当てはまります。
- operator.isNumberType(obj)
バージョン2.7以降非推奨:代わりに
isinstance(x, numbers.Number)
を使用してください。オブジェクト obj が数値を表す場合はtrueを返します。 これは、Cで実装されているすべての数値型に当てはまります。
- operator.isSequenceType(obj)
バージョン2.7以降非推奨:代わりに
isinstance(x, collections.Sequence)
を使用してください。オブジェクト obj がシーケンスプロトコルをサポートしている場合はtrueを返します。 これは、Cでシーケンスメソッドを定義するすべてのオブジェクト、および __ getitem __()を定義するすべてのインスタンスオブジェクトに対してtrueを返します。
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 モジュールの関数にどのように対応するかを示しています。
手術 | 構文 | 関数 |
---|---|---|
添加 | a + b
|
add(a, b)
|
連結 | seq1 + seq2
|
concat(seq1, seq2)
|
封じ込めテスト | obj in seq
|
contains(seq, obj)
|
分割 | a / b
|
div(a, b) (__future__.division なし)
|
分割 | a / b
|
truediv(a, b) (__future__.division を使用)
|
分割 | a // b
|
floordiv(a, b)
|
ビット単位および | a & b
|
and_(a, b)
|
ビット単位の排他的論理和 | a ^ b
|
xor(a, b)
|
ビット単位の反転 | ~ a
|
invert(a)
|
ビット単位または | b | or_(a, b)
|
べき乗 | a ** b
|
pow(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 << b
|
lshift(a, b)
|
モジュロ | a % b
|
mod(a, b)
|
乗算 | a * b
|
mul(a, b)
|
否定(算術) | - a
|
neg(a)
|
否定(論理) | not a
|
not_(a)
|
ポジティブ | + a
|
pos(a)
|
右シフト | a >> b
|
rshift(a, b)
|
シーケンスの繰り返し | seq * i
|
repeat(seq, i)
|
スライスの割り当て | 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)
|
真実のテスト | obj
|
truth(obj)
|
注文 | a < b
|
lt(a, b)
|
注文 | a <= b
|
le(a, b)
|
平等 | a == b
|
eq(a, b)
|
違い | a != b
|
ne(a, b)
|
注文 | a >= b
|
ge(a, b)
|
注文 | a > b
|
gt(a, b)
|