?operator --- 標準運算符替代函數?

源代碼:?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)

在?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?相同。注意這些函數可以返回任何值,無論它是否可當作布爾值。關于全比較的更多信息請參考?比較運算?。

邏輯運算通常也適用于所有對象,并且支持真值檢測、標識檢測和布爾運算:

operator.not_(obj)

operator.__not__(obj)

返回?not?obj?的結果。 (請注意對象實例并沒有?__not__()?方法;只有解釋器核心可定義此操作。 結果會受到?__bool__()?和?__len__()?方法的影響。)

operator.truth(obj)

如果?obj?為真值則返回?True,否則返回?False。 這等價于使用?bool?構造器。

operator.is_(a,?b)

返回?a?is?b。 檢測對象標識。

operator.is_not(a,?b)

返回?a?is?not?b。 檢測對象標識。

數學和按位運算的種類是最多的:

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)

返回?x?和?y?按位與的結果。

operator.floordiv(a,?b)

operator.__floordiv__(a,?b)

返回?a?//?b

operator.index(a)

operator.__index__(a)

返回?a?轉換為整數的結果。 等價于?a.__index__()

在 3.10 版更改:?結果總是為?int?類型。 在之前版本中,結果可能為?int?的子類的實例。

operator.inv(obj)

operator.invert(obj)

operator.__inv__(obj)

operator.__invert__(obj)

返回數字?obj?按位取反的結果。 這等價于?~obj

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

返回?a?和?b?按位或的結果。

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)

返回?a?右移?b?位的結果。

operator.sub(a,?b)

operator.__sub__(a,?b)

返回?a?-?b

operator.truediv(a,?b)

operator.__truediv__(a,?b)

返回?a?/?b?例如 2/3 將等于 .66 而不是 0。 這也被稱為“真”除法。

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?檢測的結果。 請注意操作數是反序的。

operator.countOf(a,?b)

返回?b?在?a?中的出現次數。

operator.delitem(a,?b)

operator.__delitem__(a,?b)

移除?a?中索引號為?b?的值。

operator.getitem(a,?b)

operator.__getitem__(a,?b)

返回?a?中索引為?b?的值。

operator.indexOf(a,?b)

返回?b?在?a?中首次出現所在的索引號。

operator.setitem(a,?b,?c)

operator.__setitem__(a,?b,?c)

將?a?中索引號為?b?的值設為?c

operator.length_hint(obj,?default=0)

返回對象?obj?的估計長度。 首先嘗試返回其實際長度,再使用?object.__length_hint__()?得出估計值,最后返回默認值。

3.4 新版功能.

以下操作適用于可調用對象:

operator.call(obj,?/,?*args,?**kwargs)

operator.__call__(obj,?/,?*args,?**kwargs)

返回?obj(*args,?**kwargs)

3.11 新版功能.

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 gdef 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__()?方法所接受的任何類型。 字典接受任意?hashable?值。 列表、元組和字符串接受索引或切片對象:

>>>

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

按位或

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)

原地運算符

許多運算都有“原地”版本。 以下列出的是提供對原地運算符相比通常語法更底層訪問的函數,例如?statement?x?+=?y?相當于?x?=?operator.iadd(x,?y)。 換一種方式來講就是?z?=?operator.iadd(x,?y)?等價于語句塊?z?=?x;?z?+=?y

在這些例子中,請注意當調用一個原地方法時,運算和賦值是分成兩個步驟來執行的。 下面列出的原地函數只執行第一步即調用原地方法。 第二步賦值則不加處理。

對于不可變的目標例如字符串、數字和元組,更新的值會被計算,但不會被再被賦值給輸入變量:

>>>

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/212114.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212114.shtml
英文地址,請注明出處:http://en.pswp.cn/news/212114.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java - HashMap

數組和鏈表 數組&#xff1a; 存儲區間是連續&#xff0c;且占用內存嚴重&#xff0c;空間復雜也很大&#xff0c;時間復雜為O&#xff08;1&#xff09; 優點&#xff1a;是隨機讀取效率很高&#xff0c;原因數組是連續&#xff08;隨機訪問性強&#xff0c;查找速度快&#x…

properties配置和讀取

如何配置和讀取屬性文件 1.屬性文件介紹1.1 什么是屬性文件1.2屬性文件規范1.3 屬性文件優缺點 2.屬性文件讀取4.spring和屬性文件4.1利用注解讀取4.2配置文件里直接引用 4.屬性文件寫入5.注意事項5.總結 1.屬性文件介紹 1.1 什么是屬性文件 Java開發中&#xff0c;我們經常需…

Qt6.5類庫實例大全:Qt Creator快速入門

哈嘍大家好&#xff0c;我是20YC編程小二&#xff01;掃碼關注公眾號&#xff0c;現在可免費領取《C程序員》在線視頻教程哦&#xff01;#下面開始今天內容# 1. Qt Creator介紹 Qt Creator是一個輕量級的跨平臺集成開發環境(IDE)&#xff0c;專為使用Qt框架進行應用程序開發而…

華為OD機試真題-攀登者1-2023年OD統一考試(C卷)

題目描述: 攀登者喜歡尋找各種地圖,并且嘗試攀登到最高的山峰。 地圖表示為一維數組,數組的索引代表水平位置,數組的高度代表相對海拔高度。其中數組元素0代表地面。 例如[0,1,2,4,3,1,0,0,1,2,3,1,2,1,0], 代表如下圖所示的地圖,地圖中有兩個山脈位置分別為 1,2,3,4,5和8…

基于深度學習的文本分類研究綜述

摘要 與傳統的機器學習模型相比&#xff0c;深度學習模型試圖模仿人的學習思路&#xff0c;通過計算機自動進行海量數據的特征提取工作。文本分類是自然語言處理中的一個重要應用&#xff0c;在文本信息處理過程中有著關鍵作用。過去幾年&#xff0c;由于深度學習研究的空前成…

NAND閃存市場2023年Q3增長2.9%,Q4有望激增20%

TrendForce報告顯示&#xff0c;NAND閃存市場在2023年第三季度出現了關鍵轉折&#xff0c;主要由三星的戰略性減產決定驅動。最初&#xff0c;市場對終端用戶需求的不確定性以及對平淡旺季的擔憂導致買家采取保守的方法&#xff0c;庫存低、采購慢。然而&#xff0c;隨著三星等…

華為新款筆記本搭載5nm麒麟芯片,來源成謎,可能讓大家失望了~

近日&#xff0c;華為公司悄悄推出了一款基于國產技術打造的全新商用筆記本——華為擎云L540。目前&#xff0c;華為擎云L540在京東平臺悄然上線的&#xff0c;尚未在華為官方渠道公開售賣。華為擎云L540搭載了麒麟9006C處理器&#xff0c;采用先進的5nm制程工藝&#xff0c;8 …

codeforces A. Morning

思路 模擬&#xff0c;按順序移動移動到對應位置貢獻為移動的步數&#xff0c;press的次數。 Think Twice, Code Once #include<bits/stdc.h> #define il inline #define get getchar #define put putchar #define is isdigit #define int long long #define dfor(i,a…

openGauss學習筆記-150 openGauss 數據庫運維-備份與恢復-物理備份與恢復之gs_backup

文章目錄 openGauss學習筆記-150 openGauss 數據庫運維-備份與恢復-物理備份與恢復之gs_backup150.1 背景信息150.2 前提條件150.3 語法150.4 參數說明150.5 示例 openGauss學習筆記-150 openGauss 數據庫運維-備份與恢復-物理備份與恢復之gs_backup 150.1 背景信息 openGaus…

錯題總結(四)

1.【一維數組】輸入10個整數&#xff0c;求平均值 編寫一個程序&#xff0c;從用戶輸入中讀取10個整數并存儲在一個數組中。然后&#xff0c;計算并輸出這些整數的平均值。 int main() {int arr[10];int sum 0;for (int n 0; n < 10; n){scanf("%d", &arr…

[完美解決]Accelerate設置單卡訓練報錯,成功設置單卡訓練

報錯內容 ValueError: Less than two GPU ids were configured and tried to run on on multiple GPUs. Please ensure at least two are specified for --gpu_ids, or use --gpu_idsall. ValueError:配置了少于兩個GPU id&#xff0c;并試圖在多個GPU上運行。請確保為——gpu…

小黑子——springBoot基礎

springBoot簡單學習 一、SpringBoot簡介1.1 springBoot快速入門1.1.1 開發步驟1.1.2 對比1.1.3 官網構建工程1.1.3 SpringBoot工程快速啟動 1.2 springBoot概述1.2.1 起步依賴I. 探索父工程II. 探索依賴III. 小結 1.2.2 程序啟動1.2.3 切換web服務器-jetty 二、配置文件2.1 配置…

C語言精選——選擇題Day43

第一題 1. 使用malloc系統調用分配的內存是在什么上分配的&#xff1f; A&#xff1a;棧 B&#xff1a;堆 答案及解析 B malloc開辟的空間都是在堆上申請的內存空間&#xff0c;但是我們平常定義的定長數組之類的&#xff0c;都是在棧上開辟的空間&#xff1b; 第二題 2. C語言…

scala變量與變量類型

1.6 變量與類型&#xff08;重點&#xff09;1.6.1 變量推斷1.6.2 多變量定義1.6.3 var和val的區別 1.6.3.1 是否可變 1.6.3.2 延遲加載 1.6 變量與類型&#xff08;重點&#xff09; val修飾的變量&#xff0c;相當于Java中final修飾的變量; // 定義常量s1&#xff0c;使用…

[每周一更]-(第76期):Go源碼閱讀與分析的方式

讀源碼可以深層理解Go的編寫方式&#xff0c;理解作者們的思維方式&#xff1b;也有助于對Go語法用法深刻的理解&#xff0c;我們從這一篇說一下如何讀源碼&#xff0c;從哪些源碼著手&#xff0c;從 簡單到深入的方式學習源碼&#xff1b; 學習源碼也是一個修煉過程&#xff0…

「斗破年番」卡點俠蕭炎又卡點救人,四長老毒氣攻心,黑皇城尋寶

Hello,小伙伴們&#xff0c;我是拾荒君。 《斗破蒼穹年番》第74集如約而至&#xff0c;帶給觀眾們更多的驚喜與感動。這一集中&#xff0c;蕭炎的體內魔毒斑暫時被厄難毒體所壓制&#xff0c;他決定回到迦南學院&#xff0c;尋求斗尊強者的幫助解決這個問題。然而&#xff0c;…

深入理解 Flask 中的 Session 和 Cookies

在構建 web 應用時,管理用戶的狀態和數據是至關重要的。Flask,作為一個靈活的微型 web 框架,提供了會話(Session)和 Cookies 管理的能力。本文將深入探討 Flask 中的會話和 Cookies 的概念、工作機制以及應用實例,為讀者提供全面而詳細的理解。 會話和 Cookies 的基本概…

【LeetCode熱題100】【滑動窗口】找到字符串中所有字母異位詞

給定兩個字符串 s 和 p&#xff0c;找到 s 中所有 p 的 異位詞 的子串&#xff0c;返回這些子串的起始索引。不考慮答案輸出的順序。 異位詞 指由相同字母重排列形成的字符串&#xff08;包括相同的字符串&#xff09;。 示例 1: 輸入: s "cbaebabacd", p "…

611.有效的三角形個數

1.題目解析 給定一個包含非負整數的數組 nums &#xff0c;返回其中可以組成三角形三條邊的三元組個數。 補充&#xff1a; 1.三角形的判斷&#xff1a;假設有三條邊按大小排序&#xff1a; 2.題目示例 示例 1: 輸入: nums [2,2,3,4] 輸出: 3 解釋:有效的組合是: 2,3,4 (使用…

P1161 開燈題解

題目 在一條無限長的路上&#xff0c;有一排無限長的路燈&#xff0c;編號為1,2,3,4,…。 每一盞燈只有兩種可能的狀態&#xff0c;開或者關。如果按一下某一盞燈的開關&#xff0c;那么這盞燈的狀態將發生改變。如果原來是開&#xff0c;將變成關。如果原來是關&#xff0c;…