[python標準ライブラリ]operator-オペレータを内蔵する関数インタフェース

7223 ワード

[python標準ライブラリ]operator-内蔵オペレータの関数インタフェースの役割:内蔵オペレータの関数インタフェース.Pythonバージョン:1.4以降のバージョンで反復プログラムを使用する場合、簡単な式に小さな関数を作成する必要がある場合があります.場合によっては、これらは確かにlambda関数として実装できますが、いくつかの操作には新しい関数は必要ありません.Operatorモジュールは、算術と比較に組み込まれた操作に対応するいくつかの関数を定義します.論理操作には、値の対応するBoolean値を決定し、それを逆にして反対のBoolean値を作成し、比較オブジェクトが等しいかどうかを確認する関数があります.
from operator import *

a = -1
b = 5

print 'a =', a
print 'b =', b
print

print 'not_(a)     :', not_(a)
print 'truth(a)    :', truth(a)
print 'is_(a, b)   :', is_(a, b)
print 'is_not(a, b):', is_not(a, b)

   
    not_()後ろに下線があります.notはPythonキーワードですから.truth()はif文で式をテストするときに使用される同じ論理を適用します.is_()isキーワードで使用される同じチェックを実現しました,is_not()は同じテストを完了しますが、反対の答えを返します.比較オペレータは、すべてのリッチ比較オペレータでサポートされています.
from operator import *

a = 1
b = 5.0
print 'a =', a
print 'b =', b
for func in (lt, le, eq, ne, ge, gt):
    print '%s(a, b):' % func.__name__, func(a, b)

   
これらの関数は、=および>の式構文を使用するのと同じです.算術オペレータが数値値を処理する算術オペレータもサポートされています.
from operator import *

a = -1
b = 5.0
c = 2
d = 6

print 'a =', a
print 'b =', b
print 'c =', c
print 'd =', d

print '
Positive/Negative:' print 'abs(a):', abs(a) print 'neg(a):', neg(a) print 'neg(b):', neg(b) print 'pos(a):', pos(a) print 'pos(b):', pos(b) print '
Arithmetic:' print 'add(a, b) :', add(a, b) print 'div(a, b) :', div(a, b) print 'div(d, c) :', div(d, c) print 'floordiv(a, b):', floordiv(a, b) print 'floordiv(d, c):', floordiv(d, c) print 'mod(a, b) :', mod(a, b) print 'mul(a, b) :', mul(a, b) print 'pow(c, d) :', pow(c, d) print 'sub(b, a) :', sub(b, a) print 'truediv(a, b) :', truediv(a, b) print 'truediv(d, c) :', truediv(d, c) print '
Bitwise:' print 'and_(c, d) :', and_(c, d) print 'invert(c) :', invert(c) print 'lshift(c, d):', lshift(c, d) print 'or_(c, d) :', or_(c, d) print 'rshift(d, c):', rshift(d, c) print 'xor(c, d) :', xor(c, d)

   
2つの異なる除算オペレータがあります.floordiv()(Python 3.0以前に実装された整数除算)とtruediv()(浮動小数点数除算)です.シーケンスオペレータがシーケンスを処理するオペレータは、シーケンスの作成、要素の検索、コンテンツへのアクセス、およびシーケンスから要素を削除する4つのグループに分けることができます.
from operator import *

a = [ 1, 2, 3 ]
b = [ 'a', 'b', 'c' ]

print 'a =', a
print 'b =', b

print '
Constructive:' print ' concat(a, b):', concat(a, b) print ' repeat(a, 3):', repeat(a, 3) print '
Searching:' print ' contains(a, 1) :', contains(a, 1) print ' contains(b, "d"):', contains(b, "d") print ' countOf(a, 1) :', countOf(a, 1) print ' countOf(b, "d") :', countOf(b, "d") print ' indexOf(a, 5) :', indexOf(a, 1) print '
Access Items:' print ' getitem(b, 1) :', getitem(b, 1) print ' getslice(a, 1, 3) :', getslice(a, 1, 3) print ' setitem(b, 1, "d") :', setitem(b, 1, "d"), print ', after b =', b print ' setslice(a, 1, 3, [4, 5]):', setslice(a, 1, 3, [4, 5]), print ', after a =', a print '
Destructive:' print ' delitem(b, 1) :', delitem(b, 1), ', after b =', b print ' delslice(a, 1, 3):', delslice(a, 1, 3), ', after a=', a

   
setitem()やdelitem()などのいくつかの操作では、値を返さずにシーケンスが変更されます.[その場](Place)オペレータ標準オペレータに加えて、多くのオブジェクトタイプは、+=などの特殊なオペレータによって[その場](Place)修正をサポートします.これらのフィールド修正にも対応する等価関数があります.
from operator import *

a = -1
b = 5.0
c = [ 1, 2, 3]
d = [ 'a', 'b', 'c' ]
print 'a =', a
print 'b =', b
print 'c =', c
print 'd =', d
print

a = iadd(a, b)
print 'a = iadd(a, b) =>', a
print

c = iconcat(c, d)
print 'c = oconcat(c, d) =>', c

   
これらの例は一部の関数のみを示している.属性と要素の「取得方法」operatorモジュールの最も特別な特性の一つは、取得方法(getter)の概念である.取得方法は、オブジェクトのプロパティまたはシーケンスの内容を取得するために実行時に構築されたコールバック可能なオブジェクトです.取得方法は、反復器またはジェネレータシーケンスを処理する際に特に有用であり、lambdaまたはPython関数のオーバーヘッドよりも大幅に低いオーバーヘッドを導入する.
from operator import *

class MyObj(object):
    """example class for attrgetter"""
    def __init__(self, arg):
        super(MyObj, self).__init__()
        self.arg = arg
    def __repr__(self):
        return 'MyObj(%s)' % self.arg

l = [ MyObj(i) for i in xrange(5) ]
print 'objects   :', l

# Extract thr 'arg' value from each object
g = attrgetter('arg')
vals = [ g(i) for i in l ]
print 'arg values:', vals

# Sort using arg
l.reverse()
print 'reversed  :', l
print 'sorted    :', sorted(l, key=g)

   
属性取得方法の動作はlambda x,n='attrname':getattr(x,n);要素取得方法の動作はlambda x,y=5:x[y];
from operator import *

l = [ dict(val=-1 * i) for i in xrange(4) ]
print 'Dictionaries:', l
g = itemgetter('val')
vals = [ g(i) for i in l ]
print '      values:', vals
print '      sorted:', sorted(l, key=g)
print
l = [ (i, i*-2) for i in xrange(4) ]
print 'Tuples      :', l
g = itemgetter(1)
vals = [ g(i) for i in l ]
print '      values:', vals
print '      sorted:', sorted(l, key=g)

   
シーケンスに加えて、要素取得方法はマッピングにも適しています.オペレータとカスタムクラスoperatorモジュールの関数を組み合わせて、対応する操作の標準Pythonインタフェースで作業を完了するため、組み込みタイプだけでなく、ユーザー定義のクラスにも適しています.
from operator import *

class MyObj(object):
    """example class for attrgetter"""
    def __init__(self, val):
        super(MyObj, self).__init__()
        self.val = val
        return
    def __str__(self):
        return 'MyObj(%s)' % self.val
    def __lt__(self, other):
        """compare for less-than"""
        print 'Testing %s < %s' % (self, other)
        return self.val < other.val
    def __add__(self, other):
        """add values"""
        print 'Adding %s + %s' % (self, other)
        return MyObj(self.val + other.val)
a = MyObj(1)
b = MyObj(2)

print 'Comparison:'
print lt(a, b)

print '
Arithmetic:' print add(a, b)

タイプチェックoperatorモジュールには、マッピング、数値、シーケンスのAPI互換性をテストする関数も含まれています.
from operator import *

class NoType(object):
    """Supports none of the type APIs"""

class MultiType(object):
    """Supports multiple type APIs"""
    def __len__(slef):
        return 0
    def __getitem__(slef, name):
        return 'mapping'
    def __int__(self):
        return 0

o = NoType()
t = MultiType()

for func in (isMappingType, isNumberType, isSequenceType):
    print '%s(o):' % func.__name__, func(o)
    print '%s(t):' % func.__name__, func(t)

   
これらのテストは、インタフェースが厳密に定義されていないため、完全ではありませんが、これらのテストを通じて、どの機能をサポートするかを理解することができます.