内蔵オペレータ1.オペレータ機能インターフェース
イテレータのプログラミングを使用している場合、時にはあなたは、単純な式として小さな関数を作成する必要があります。いくつかのケースでは、けれども、これは確かにラムダ関数として実装することができますが、一部の操作は、新たな機能を必要としません。オペレータモジュールは、いくつかの関数を定義し、それは標準APIに対応することができる内蔵の演算、比較、およびその他の操作オブジェクト。
1.1論理演算
いくつかの機能は、反対のブール値、それらが等しいかどうかを見るために比較を作成するために反転され、対応するブール値の値を決定するために使用することができます。
オペレータのインポート * = -1 B = 5 印刷(' = ' ) プリント(' B = ' 、B) プリント() 印刷(' NOT_ARCHIVEDの():' 、NOT_ARCHIVEDの()) プリント(' 真実():' 、真実()) プリント(' is_(A、B):' 、is_(b)参照) 印刷(' is_not(B):'、is_not(b)参照)
ないPythonのキーワードのでNOT_ARCHIVEDのは()、アンダースコアが続きます。ステートメントまたは式がブール値に変換された場合、論理式をテストするいくつかの種類を使用して、真理()同じ論理が適用されたそれです。is_()が実装キーワードチェックは、使用されているis_not()同じテストを完了することが、反対の答えを返しました。
1.2比較演算子
これは、すべての豊富な比較演算子をサポートしています。
オペレータのインポート * A = 1 、B = 5.0 印刷(' = ' ) プリント(' B = ' 、B) のための FUNC で(LT、LE、EQ、NE、GE、GT): プリント(' {}(B):{} '。フォーマット(FUNC。__name__、FUNC(b)参照))
これらの関数は、<、<=、==、> =、および>表現構文の使用に相当します。
1.3算術演算子
算術演算子は、デジタル値の処理をサポートしています。
オペレータのインポート * = -1 、B = 5.0 、C = 2 、D = 6 印刷(' = ' ) プリント(' B = ' 、B) プリント(' C = ' 、C) プリント(' D = ' 、D) 印刷(' \ nPositive /負:' ) プリント(' ABS():' 、ABS()) プリント(' NEG():' 、NEG()) プリント(' NEG(B):' 、 NEG(b)参照) 、印刷(' POS():' 、POS()) プリント(' POS(B):' 、POS(B)) 印刷(' \ nArithmetic:' ) プリント(' )(A、Bを追加:' 、(a、b)はADD) プリント(' floordiv(A、B):' 、floordiv(b)参照) 、印刷(" floordivを(D、C):'floordiv(D、C)) プリント(' MOD(A、B):'MOD(b)参照) 、印刷(' (B MUL):' 、(MUL、 B)) プリント(' POW(C、D):' 、POW(C、D)) プリント('サブ(B):' サブ(B)) プリント(' truediv(B):'truediv(b)参照) 、印刷(' truediv(D、C):' 、truediv(D 、c)参照) 印刷(' \ nBitwise:' ) プリント(' and_(C、D):' 、and_(C、D)) プリント(' 反転(C):' 、反転(C)) 、印刷(「LSHIFT(C、D ):'LSHIFT(C、D)) プリント(' or_(C、D):'or_(C、D)) プリント(' RSHIFT(D、C):' 、RSHIFT(D、C)) 印刷(' XOR(C、D):'、XOR(C、D))
そしてtruediv()(浮動小数点除算)(分割は、Python 3.0バージョンの前に達成整数)floordiv()2つの異なるオペレータ出発提供します。
1.4シリーズ演算子
处理系列的操作符可以分为4组:建立序列、搜索元素、访问内容以及从序列删除元素。
from operator import * a = [1, 2, 3] b = ['a', 'b', 'c'] print('a =', a) print('b =', b) print('\nConstructive:') print(' concat(a, b):', concat(a, b)) print('\nSearching:') 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('\nAccess Items:') print(' getitem(b, 1) :', getitem(b, 1)) print(' getitem(b, slice(1, 3)) :', getitem(b, slice(1, 3))) print(' setitem(b, 1, "d") :', end=' ') setitem(b, 1, "d") print(b) print(' setitem(a, slice(1, 3), [4, 5]):', end=' ') setitem(a, slice(1, 3), [4, 5]) print(a) print('\nDestructive:') print(' delitem(b, 1) :', end=' ') delitem(b, 1) print(b) print(' delitem(a, slice(1, 3)):', end=' ') delitem(a, slice(1, 3)) print(a)
其中一些操作(如setitem()和delitem())会原地修改序列,而且不返回任何值。
1.5 原地操作符
除了标准操作符,很多对象类型还通过一些特殊操作符(如+=)支持”原地”修改。这些原地修改也有相应的等价函数。
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 = iconcat(c, d) =>', c)
1.6 属性和元素“获取方法”
operator模块最特别的特性之一是获取方法(getter)的概念。获取方法是运行时构造的一些callable对象,用来获取对象的属性或序列的内容。获取方法在处理迭代器或生成器序列时特别有用,因为获取方法引入的开销会大大低于lambda或Python函数的开销。
from operator import * class MyObj: """example class for attrgetter""" def __init__(self, arg): super().__init__() self.arg = arg def __repr__(self): return 'MyObj({})'.format(self.arg) l = [MyObj(i) for i in range(5)] print('objects :', l) # Extract the '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 range(4)] print('Dictionaries:') print(' original:', 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 range(4)] print('\nTuples:') print(' original:', l) g = itemgetter(1) vals = [g(i) for i in l] print(' values:', vals) print(' sorted:', sorted(l, key=g))
除了序列,元素获取方法还适用于映射。
1.7 结合操作符和定制类
operator模块中的函数完成操作符时会使用标准Python接口,所以它们不仅适用于内置类型,也适用于用户定义的类。
from operator import * class MyObj: """Example for operator overloading""" def __init__(self, val): super(MyObj, self).__init__() self.val = val def __str__(self): return 'MyObj({})'.format(self.val) def __lt__(self, other): """compare for less-than""" print('Testing {} < {}'.format(self, other)) return self.val < other.val def __add__(self, other): """add values""" print('Adding {} + {}'.format(self, other)) return MyObj(self.val + other.val) a = MyObj(1) b = MyObj(2) print('Comparison:') print(lt(a, b)) print('\nArithmetic:') print(add(a, b))