演算子—関数としての標準演算子—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.8/library/operator
移動先:案内検索

operator —関数としての標準演算子

ソースコード: :source: `Lib / operator.py`



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)

ab の間で「豊富な比較」を実行します。 具体的には、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と同等です。 これらの関数は任意の値を返すことができ、ブール値として解釈できる場合とできない場合があることに注意してください。 豊富な比較の詳細については、比較を参照してください。

論理演算は一般にすべてのオブジェクトに適用可能であり、真理検定、ID検定、およびブール演算をサポートします。

operator.not_(obj)

operator.__not__(obj)

not obj の結果を返します。 (オブジェクトインスタンスには __ not __()メソッドがないことに注意してください。この操作を定義するのはインタープリターコアのみです。 結果は、__bool__()および__len__()メソッドの影響を受けます。)
operator.truth(obj)
obj がtrueの場合は True を返し、それ以外の場合は False を返します。 これは、 bool コンストラクターを使用するのと同じです。
operator.is_(a, b)
a is bを返します。 オブジェクトのIDをテストします。
operator.is_not(a, b)
a is not bを返します。 オブジェクトのIDをテストします。

数学演算とビット演算が最も多くあります。

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)

ab のビット単位を返します。
operator.floordiv(a, b)

operator.__floordiv__(a, b)

a // bを返します。
operator.index(a)

operator.__index__(a)

整数に変換された a を返します。 a.__index__()と同等です。
operator.inv(obj)

operator.invert(obj)
operator.__inv__(obj)
operator.__invert__(obj)

数値 obj のビット単位の逆数を返します。 これは~objと同等です。
operator.lshift(a, b)

operator.__lshift__(a, b)

ab だけ左にシフトして返します。
operator.mod(a, b)

operator.__mod__(a, b)

a % bを返します。
operator.mul(a, b)

operator.__mul__(a, b)

a および b 番号の場合、a * bを返します。
operator.matmul(a, b)
operator.__matmul__(a, b)

a @ bを返します。

バージョン3.5の新機能。

operator.neg(obj)

operator.__neg__(obj)

否定された obj を返します(-obj)。
operator.or_(a, b)

operator.__or__(a, b)

ab のビット単位またはを返します。
operator.pos(obj)

operator.__pos__(obj)

obj を正(+obj)に戻します。
operator.pow(a, b)

operator.__pow__(a, b)

a および b 番号の場合、a ** bを返します。
operator.rshift(a, b)

operator.__rshift__(a, b)

ab だけ右にシフトして返します。
operator.sub(a, b)

operator.__sub__(a, b)

a - bを返します。
operator.truediv(a, b)

operator.__truediv__(a, b)

a / bを返します。ここで、2/3は0ではなく.66です。 これは「真の」除算とも呼ばれます。
operator.xor(a, b)

operator.__xor__(a, b)

ab のビット単位の排他的論理和を返します。

シーケンスを処理する操作(一部はマッピングも使用)には、次のものがあります。

operator.concat(a, b)

operator.__concat__(a, b)

a および b シーケンスのa + bを返します。
operator.contains(a, b)

operator.__contains__(a, b)

テストの結果を返しますb in a。 オペランドが逆になっていることに注意してください。
operator.countOf(a, b)
a 内の b の出現回数を返します。
operator.delitem(a, b)

operator.__delitem__(a, b)

インデックス ba の値を削除します。
operator.getitem(a, b)

operator.__getitem__(a, b)

インデックス ba の値を返します。
operator.indexOf(a, b)
a で最初に出現した b のインデックスを返します。
operator.setitem(a, b, c)

operator.__setitem__(a, b, c)

インデックス ba の値を c に設定します。
operator.length_hint(obj, default=0)

オブジェクト o の推定長を返します。 最初に実際の長さを返し、次に object .__ length_hint __()を使用して見積もりを返し、最後にデフォルト値を返します。

バージョン3.4の新機能。

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 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

演算子の関数へのマッピング

この表は、抽象演算がPython構文の演算子シンボルと operator モジュールの関数にどのように対応するかを示しています。

手術 構文 関数
添加 a + b add(a, b)
連結 seq1 + seq2 concat(seq1, seq2)
封じ込めテスト obj in seq contains(seq, obj)
分割 a / b truediv(a, b)
分割 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 @ b matmul(a, b)
否定(算術) - a neg(a)
否定(論理) not a not_(a)
ポジティブ + a pos(a)
右シフト a >> b rshift(a, b)
スライスの割り当て 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)


インプレースオペレーター

多くの操作には「インプレース」バージョンがあります。 以下にリストされているのは、通常の構文よりもインプレース演算子へのより基本的なアクセスを提供する関数です。 たとえば、ステートメント x += yx = operator.iadd(x, y)と同等です。 別の言い方をすれば、z = operator.iadd(x, y)は複合ステートメントz = x; z += yと同等であると言うことです。

これらの例では、インプレースメソッドが呼び出されると、計算と割り当てが2つの別々のステップで実行されることに注意してください。 以下にリストされているインプレース関数は、インプレースメソッドを呼び出す最初のステップのみを実行します。 2番目のステップである割り当ては処理されません。

文字列、数値、タプルなどの不変のターゲットの場合、更新された値が計算されますが、入力変数には割り当てられません。

>>> 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.iadd(a, b)

operator.__iadd__(a, b)

a = iadd(a, b)a += bと同等です。
operator.iand(a, b)

operator.__iand__(a, b)

a = iand(a, b)a &= bと同等です。
operator.iconcat(a, b)

operator.__iconcat__(a, b)

a = iconcat(a, b)は、 a および b シーケンスのa += bと同等です。
operator.ifloordiv(a, b)

operator.__ifloordiv__(a, b)

a = ifloordiv(a, b)a //= bと同等です。
operator.ilshift(a, b)

operator.__ilshift__(a, b)

a = ilshift(a, b)a <<= bと同等です。
operator.imod(a, b)

operator.__imod__(a, b)

a = imod(a, b)a %= bと同等です。
operator.imul(a, b)

operator.__imul__(a, b)

a = imul(a, b)a *= bと同等です。
operator.imatmul(a, b)
operator.__imatmul__(a, b)

a = imatmul(a, b)a @= bと同等です。

バージョン3.5の新機能。

operator.ior(a, b)

operator.__ior__(a, b)

a = ior(a, b)a |= bと同等です。
operator.ipow(a, b)

operator.__ipow__(a, b)

a = ipow(a, b)a **= bと同等です。
operator.irshift(a, b)

operator.__irshift__(a, b)

a = irshift(a, b)a >>= bと同等です。
operator.isub(a, b)

operator.__isub__(a, b)

a = isub(a, b)a -= bと同等です。
operator.itruediv(a, b)

operator.__itruediv__(a, b)

a = itruediv(a, b)a /= bと同等です。
operator.ixor(a, b)

operator.__ixor__(a, b)

a = ixor(a, b)a ^= bと同等です。