operator﹝Python 標(biāo)準(zhǔn)庫(kù)﹞

轉(zhuǎn)載須注明出處:簡(jiǎn)書@Orca_J35 | GitHub@orca-j35色洞,所有筆記均托管于 python_notes 倉(cāng)庫(kù)

擴(kuò)展閱讀:

operator - Standard operators as functions

operater 模塊導(dǎo)出了一組與 Python 的內(nèi)部運(yùn)算符相對(duì)應(yīng)的函數(shù)桐早。例如 operator.add(x, y) 等價(jià)于表達(dá)式 x+y

在本模塊中床未,大多數(shù)函數(shù)名直接使用對(duì)應(yīng)的特殊方法名(但不帶下劃線)。為了向后兼容,本模塊中的許多方法還保留了具備雙下劃線方法名的變體船逮。為了使代碼易讀,請(qǐng)優(yōu)先使用沒(méi)有雙下劃線的版本粤铭。

本模塊中的方法可分為以下四類:

  • 對(duì)象比較(object comparisons)
  • 邏輯運(yùn)算(logical operations)
  • 數(shù)學(xué)運(yùn)算(mathematical operations)和位運(yùn)算(bitwise operations)
  • 序列操作(sequence operations)

運(yùn)算符和函數(shù)的映射關(guān)系

Mapping Operators to Functions

This table shows how abstract operations correspond to operator symbols in the Python syntax and the functions in the operator module.

Operation Syntax Function
Addition a + b add(a, b)
Concatenation seq1 + seq2 concat(seq1, seq2)
Containment Test obj in seq contains(seq, obj)
Division a / b truediv(a, b)
Division a // b floordiv(a, b)
Bitwise And a & b and_(a, b)
Bitwise Exclusive Or a ^ b xor(a, b)
Bitwise Inversion ~ a invert(a)
Bitwise Or `a b` or_(a, b)
Exponentiation a ** b pow(a, b)
Identity a is b is_(a, b)
Identity a is not b is_not(a, b)
Indexed Assignment obj[k] = v setitem(obj, k, v)
Indexed Deletion del obj[k] delitem(obj, k)
Indexing obj[k] getitem(obj, k)
Left Shift a << b lshift(a, b)
Modulo a % b mod(a, b)
Multiplication a * b mul(a, b)
Matrix Multiplication a @ b matmul(a, b)
Negation (Arithmetic) - a neg(a)
Negation (Logical) not a not_(a)
Positive + a pos(a)
Right Shift a >> b rshift(a, b)
Slice Assignment seq[i:j] = values setitem(seq, slice(i, j), values)
Slice Deletion del seq[i:j] delitem(seq, slice(i, j))
Slicing seq[i:j] getitem(seq, slice(i, j))
String Formatting s % obj mod(s, obj)
Subtraction a - b sub(a, b)
Truth Test obj truth(obj)
Ordering a < b lt(a, b)
Ordering a <= b le(a, b)
Equality a == b eq(a, b)
Difference a != b ne(a, b)
Ordering a >= b ge(a, b)
Ordering a > b gt(a, b)

對(duì)象比較

支持所有的富比較運(yùn)算符挖胃,并以對(duì)應(yīng)的豐富比較運(yùn)算符來(lái)命名:

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)

具體來(lái)說(shuō),當(dāng)在 ab 之間執(zhí)行"富比較"時(shí):

  • lt(a, b) is equivalent to a <b
  • le(a, b) is equivalent to a <= b
  • eq(a, b) is equivalent to a == b
  • ne(a, b) is equivalent to a != b
  • gt(a, b) is equivalent to a > b
  • ge(a, b) is equivalent to a >=b.

注意:以上方法可以返回任意值,這些值可能會(huì)(也可能不會(huì))被解釋為布爾值酱鸭。有關(guān)豐富比較的詳細(xì)信息吗垮,請(qǐng)參閱 Comparisons

邏輯運(yùn)算

邏輯操作通常也適用于所有對(duì)象凹髓,并支持真值測(cè)試烁登,身份(identity)測(cè)試和布爾操作:

operator.not_(obj)
operator.__not__(obj)
# Return the outcome of not obj. (Note that there is no __not__() method for object instances; only the interpreter core defines this operation. The result is affected by the __bool__() and __len__() methods.)

operator.truth(obj)
# Return True if obj is true, and False otherwise. This is equivalent to using the bool constructor.

operator.is_(a, b)
# Return a is b. Tests object identity.

operator.is_not(a, b)
# Return a is not b. Tests object identity.

數(shù)學(xué)運(yùn)算和位運(yùn)算

數(shù)學(xué)運(yùn)算

operator.abs(obj)
operator.__abs__(obj)
# Return the absolute value of obj.

operator.add(a, b)
operator.__add__(a, b)
# Return a + b, for a and b numbers.

operator.floordiv(a, b)
operator.__floordiv__(a, b)
# Return a // b.

operator.index(a)
operator.__index__(a)
# Return a converted to an integer. Equivalent to a.__index__().

operator.mod(a, b)
operator.__mod__(a, b)
# Return a % b.

operator.mul(a, b)
operator.__mul__(a, b)
# Return a * b, for a and b numbers.

operator.matmul(a, b)
operator.__matmul__(a, b)
# Return a @ b.
# New in version 3.5.

operator.neg(obj)
operator.__neg__(obj)
# Return obj negated (-obj).

operator.pos(obj)
operator.__pos__(obj)
# Return obj positive (+obj).

operator.pow(a, b)
operator.__pow__(a, b)
# Return a ** b, for a and b numbers.

operator.sub(a, b)
operator.__sub__(a, b)
# Return a - b.

operator.truediv(a, b)
operator.__truediv__(a, b)
# Return a / b where 2/3 is .66 rather than 0. This is also known as “true” division.

位運(yùn)算

operator.and_(a, b)
operator.__and__(a, b)
# Return the bitwise and of a and b.

operator.inv(obj)
operator.invert(obj)
operator.__inv__(obj)
operator.__invert__(obj)
# Return the bitwise inverse of the number obj. This is equivalent to ~obj.

operator.lshift(a, b)
operator.__lshift__(a, b)
# Return a shifted left by b.

operator.or_(a, b)
operator.__or__(a, b)
# Return the bitwise or of a and b.

operator.rshift(a, b)
operator.__rshift__(a, b)
# Return a shifted right by b.

operator.xor(a, b)
operator.__xor__(a, b)
# Return the bitwise exclusive or of a and b.

序列操作

以下操作工作于序列(部分也可用于映射)之上:

operator.concat(a, b)
operator.__concat__(a, b)
# Return a + b for a and b sequences.

operator.contains(a, b)
operator.__contains__(a, b)
# Return the outcome of the test b in a. Note the reversed operands.

operator.countOf(a, b)
# Return the number of occurrences of b in a.

operator.delitem(a, b)
operator.__delitem__(a, b)
# Remove the value of a at index b.

operator.getitem(a, b)
operator.__getitem__(a, b)
# Return the value of a at index b.

operator.indexOf(a, b)
# Return the index of the first of occurrence of b in a.

operator.setitem(a, b, c)
operator.__setitem__(a, b, c)
# Set the value of a at index b to c.

operator.length_hint(obj, default=0)
# Return an estimated length for the object o. First try to return its actual length, then an estimate using object.__length_hint__(), and finally return the default value.
# New in version 3.4.

屬性和項(xiàng)獲取器

operator 模塊還定義了用于通用屬性和項(xiàng)查找的工具。這些工具可用于 map(), sorted(), itertools.groupby() 等函數(shù)的鍵函數(shù)蔚舀,以便快速提取相應(yīng)的字段饵沧。

獲取器(getter)的開銷比 lambda (或普通函數(shù))小。

attrgetter

?? operator.attrgetter(attr)

?? operator.attrgetter(*attrs)

Return a callable object that fetches attr from its operand. If more than one attribute is requested, returns a tuple of attributes. The attribute names can also contain dots. For example:

  • After f = attrgetter('name'), the call f(b) returns b.name.
  • After f = attrgetter('name', 'date'), the call f(b) returns (b.name, b.date).
  • After f = attrgetter('name.first', 'name.last'), the call f(b) returns (b.name.first, b.name.last).

Equivalent to:

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

itemgetter

?? operator.itemgetter(item)

?? operator.itemgetter(*items)

Return a callable object that fetches item from its operand using the operand’s __getitem__() method. If multiple items are specified, returns a tuple of lookup values. For example:

  • After f = itemgetter(2), the call f(r) returns r[2].
  • After g = itemgetter(2, 5, 3), the call g(r) returns (r[2], r[5], r[3]).

Equivalent to:

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

The items can be any type accepted by the operand’s __getitem__() method. Dictionaries accept any hashable value. Lists, tuples, and strings accept an index or a slice:

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

Example of using itemgetter() to retrieve specific fields from a tuple record:

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

methodcaller

?? operator.methodcaller(name[, args...])

Return a callable object that calls the method name on its operand. If additional arguments and/or keyword arguments are given, they will be given to the method as well. For example:

  • After f = methodcaller('name'), the call f(b) returns b.name().
  • After f = methodcaller('name', 'foo', bar=1), the call f(b) returns b.name('foo', bar=1).

Equivalent to:

def methodcaller(name, *args, **kwargs):
    def caller(obj):
        return getattr(obj, name)(*args, **kwargs)
    return caller

Inplace Operators

大多數(shù)運(yùn)算符都有 “in-place” 版本赌躺。下面列出的函數(shù)提供了比常用語(yǔ)法更原始的訪問(wèn)方法狼牺。例如:

  • the statement x += y is equivalent to x = operator.iadd(x, y).
  • Another way to put it is to say that z = operator.iadd(x, y) is equivalent to the compound statement z = x; z += y.

In those examples, note that when an in-place method is called, the computation and assignment are performed in two separate steps. The in-place functions listed below only do the first step, calling the in-place method. The second step, assignment, is not handled.

For immutable targets such as strings, numbers, and tuples, the updated value is computed, but not assigned back to the input variable:

>>> a = 'hello'
>>> iadd(a, ' world')
'hello world'
>>> a
'hello'

For mutable targets such as lists and dictionaries, the inplace method will perform the update, so no subsequent assignment is necessary:

>>> 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) is equivalent to a += b.

operator.iand(a, b)
operator.__iand__(a, b)
# a = iand(a, b) is equivalent to a &= b.

operator.iconcat(a, b)
operator.__iconcat__(a, b)
# a = iconcat(a, b) is equivalent to a += b for a and b sequences.

operator.ifloordiv(a, b)
operator.__ifloordiv__(a, b)
# a = ifloordiv(a, b) is equivalent to a //= b.

operator.ilshift(a, b)
operator.__ilshift__(a, b)
# a = ilshift(a, b) is equivalent to a <<= b.

operator.imod(a, b)
operator.__imod__(a, b)
# a = imod(a, b) is equivalent to a %= b.

operator.imul(a, b)
operator.__imul__(a, b)
# a = imul(a, b) is equivalent to a *= b.

operator.imatmul(a, b)
operator.__imatmul__(a, b)
# a = imatmul(a, b) is equivalent to a @= b.
# New in version 3.5.

operator.ior(a, b)
operator.__ior__(a, b)
# a = ior(a, b) is equivalent to a |= b.

operator.ipow(a, b)
operator.__ipow__(a, b)
# a = ipow(a, b) is equivalent to a **= b.

operator.irshift(a, b)
operator.__irshift__(a, b)
# a = irshift(a, b) is equivalent to a >>= b.

operator.isub(a, b)
operator.__isub__(a, b)
# a = isub(a, b) is equivalent to a -= b.

operator.itruediv(a, b)
operator.__itruediv__(a, b)
# a = itruediv(a, b) is equivalent to a /= b.

operator.ixor(a, b)
operator.__ixor__(a, b)
# a = ixor(a, b) is equivalent to a ^= b.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市礼患,隨后出現(xiàn)的幾起案子锁右,更是在濱河造成了極大的恐慌,老刑警劉巖讶泰,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咏瑟,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡痪署,警方通過(guò)查閱死者的電腦和手機(jī)码泞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)狼犯,“玉大人余寥,你說(shuō)我怎么就攤上這事∶跎” “怎么了宋舷?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)瓢姻。 經(jīng)常有香客問(wèn)我祝蝠,道長(zhǎng),這世上最難降的妖魔是什么幻碱? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任绎狭,我火速辦了婚禮,結(jié)果婚禮上褥傍,老公的妹妹穿的比我還像新娘儡嘶。我一直安慰自己,他們只是感情好恍风,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布蹦狂。 她就那樣靜靜地躺著誓篱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凯楔。 梳的紋絲不亂的頭發(fā)上燕鸽,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音啼辣,去河邊找鬼。 笑死御滩,一個(gè)胖子當(dāng)著我的面吹牛鸥拧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播削解,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼富弦,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了氛驮?” 一聲冷哼從身側(cè)響起腕柜,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎矫废,沒(méi)想到半個(gè)月后盏缤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蓖扑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年唉铜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片律杠。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡潭流,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出柜去,到底是詐尸還是另有隱情灰嫉,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布嗓奢,位于F島的核電站讼撒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏股耽。R本人自食惡果不足惜椿肩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望豺谈。 院中可真熱鬧郑象,春花似錦、人聲如沸茬末。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至击奶,卻和暖如春辈双,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背柜砾。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工湃望, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人痰驱。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓证芭,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親担映。 傳聞我的和親對(duì)象是個(gè)殘疾皇子废士,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355