​operator --- 标准运算符替代函数​

源代码: Lib/operator.py


operator 模块提供了一套与Python的内置运算符对应的高效率函数。例如,operator.add(x, y) 与表达式 x+y 相同。 许多函数名与特殊方法名相同,只是没有双下划线。为了向后兼容性,也保留了许多包含双下划线的函数。为了表述清楚,建议使用没有双下划线的函数。

函数包含的种类有:对象的比较运算、逻辑运算、数学运算以及序列运算。

对象比较函数适用于所有的对象,函数名根据它们对应的比较运算符命名。

operator.lt(ab)

operator.le(ab)

operator.eq(ab)

operator.ne(ab)

operator.ge(ab)

operator.gt(ab)

operator.__lt__(ab)

operator.__le__(ab)

operator.__eq__(ab)

operator.__ne__(ab)

operator.__ge__(ab)

operator.__gt__(ab)

在 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_(ab)

返回 a is b。 检测对象标识。

operator.is_not(ab)

返回 a is not b。 检测对象标识。

数学和按位运算的种类是最多的:

operator.abs(obj)

operator.__abs__(obj)

返回 obj 的绝对值。

operator.add(ab)

operator.__add__(ab)

对于数字 a 和 b,返回 a + b

operator.and_(ab)

operator.__and__(ab)

返回 x 和 y 按位与的结果。

operator.floordiv(ab)

operator.__floordiv__(ab)

返回 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(ab)

operator.__lshift__(ab)

返回 a 左移 b 位的结果。

operator.mod(ab)

operator.__mod__(ab)

返回 a % b

operator.mul(ab)

operator.__mul__(ab)

对于数字 a 和 b,返回 a * b

operator.matmul(ab)

operator.__matmul__(ab)

返回 a @ b

3.5 新版功能.

operator.neg(obj)

operator.__neg__(obj)

返回 obj 取负的结果 (-obj)。

operator.or_(ab)

operator.__or__(ab)

返回 a 和 b 按位或的结果。

operator.pos(obj)

operator.__pos__(obj)

返回 obj 取正的结果 (+obj)。

operator.pow(ab)

operator.__pow__(ab)

对于数字 a 和 b,返回 a ** b

operator.rshift(ab)

operator.__rshift__(ab)

返回 a 右移 b 位的结果。

operator.sub(ab)

operator.__sub__(ab)

返回 a - b

operator.truediv(ab)

operator.__truediv__(ab)

返回 a / b 例如 2/3 将等于 .66 而不是 0。 这也被称为“真”除法。

operator.xor(ab)

operator.__xor__(ab)

返回 a 和 b 按位异或的结果。

适用于序列的操作(其中一些也适用于映射)包括:

operator.concat(ab)

operator.__concat__(ab)

对于序列 a 和 b,返回 a + b

operator.contains(ab)

operator.__contains__(ab)

返回 b in a 检测的结果。 请注意操作数是反序的。

operator.countOf(ab)

返回 b 在 a 中的出现次数。

operator.delitem(ab)

operator.__delitem__(ab)

移除 a 中索引号为 b 的值。

operator.getitem(ab)

operator.__getitem__(ab)

返回 a 中索引为 b 的值。

operator.indexOf(ab)

返回 b 在 a 中首次出现所在的索引号。

operator.setitem(abc)

operator.__setitem__(abc)

将 a 中索引号为 b 的值设为 c

operator.length_hint(objdefault=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(ab)

operator.__iadd__(ab)

a = iadd(a, b) 等价于 a += b

operator.iand(ab)

operator.__iand__(ab)

a = iand(a, b) 等价于 a &= b

operator.iconcat(ab)

operator.__iconcat__(ab)

a = iconcat(a, b) 等价于 a += b 其中 a 和 b 为序列。

operator.ifloordiv(ab)

operator.__ifloordiv__(ab)

a = ifloordiv(a, b) 等价于 a //= b

operator.ilshift(ab)

operator.__ilshift__(ab)

a = ilshift(a, b) 等价于 a <<= b

operator.imod(ab)

operator.__imod__(ab)

a = imod(a, b) 等价于 a %= b

operator.imul(ab)

operator.__imul__(ab)

a = imul(a, b) 等价于 a *= b

operator.imatmul(ab)

operator.__imatmul__(ab)

a = imatmul(a, b) 等价于 a @= b

3.5 新版功能.

operator.ior(ab)

operator.__ior__(ab)

a = ior(a, b) 等价于 a |= b

operator.ipow(ab)

operator.__ipow__(ab)

a = ipow(a, b) 等价于 a **= b

operator.irshift(ab)

operator.__irshift__(ab)

a = irshift(a, b) 等价于 a >>= b

operator.isub(ab)

operator.__isub__(ab)

a = isub(a, b) 等价于 a -= b

operator.itruediv(ab)

operator.__itruediv__(ab)

a = itruediv(a, b) 等价于 a /= b

operator.ixor(ab)

operator.__ixor__(ab)

a = ixor(a, b) 等价于 a ^= b

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/212114.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java - HashMap

数组和链表 数组&#xff1a; 存储区间是连续&#xff0c;且占用内存严重&#xff0c;空间复杂也很大&#xff0c;时间复杂为O&#xff08;1&#xff09; 优点&#xff1a;是随机读取效率很高&#xff0c;原因数组是连续&#xff08;随机访问性强&#xff0c;查找速度快&#x…

Qt6.5类库实例大全:Qt Creator快速入门

哈喽大家好&#xff0c;我是20YC编程小二&#xff01;扫码关注公众号&#xff0c;现在可免费领取《C程序员》在线视频教程哦&#xff01;#下面开始今天内容# 1. Qt Creator介绍 Qt Creator是一个轻量级的跨平台集成开发环境(IDE)&#xff0c;专为使用Qt框架进行应用程序开发而…

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 …

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 配置…

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

【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 (使用…

C现代方法(第27章)笔记——C99对数学计算的新增支持

文章目录 第27章 C99对数学计算的新增支持27.1 <stdint.h>: 整数类型(C99)27.1.1 <stdint.h>类型27.1.2 对指定宽度整数类型的限制27.1.3 对其他整数类型的限制27.1.4 用于整型常量的宏 27.2 <inttype.h>: 整数类型的格式转换(C99)27.2.1 用于格式指定符的宏…

人工智能与自然语言处理

人工智能&#xff08;AI&#xff09;与自然语言处理&#xff08;NLP&#xff09;是当前科技领域的两大热门话题。人工智能通过模拟人类的思维过程和智能行为&#xff0c;使计算机具备了一定的智能和自学能力。而自然语言处理则是指计算机对人类语言进行理解、处理和生成的技术。…

PCIe MPS参数介绍及如何更改

目录 1.简介 2.主要功能作用 3.MPS控制策略 4.如何更改 1.简介 MPS 该参数含义是一个TLP包里携带的有效净荷的最大值是多少字节&#xff08;该限制条件同时适用于写操作和读操作&#xff09;。 MRRS 该参数含义是一个TLP读请求包&#xff0c;一次最多能向接收端请求读出…

计算机毕业设计JAVA+SSM+springboot养老院管理系统

设计了养老院管理系统&#xff0c;该系统包括管理员&#xff0c;医护人员和老人三部分。同时还能为用户提供一个方便实用的养老院管理系统&#xff0c;管理员在使用本系统时&#xff0c;可以通过系统管理员界面管理用户的信息&#xff0c;也可以进行个人中心&#xff0c;医护等…

LeetCode 108. 将有序数组转换为二叉搜索树

对于算法题&#xff0c;按题型类别刷题才会更有成效&#xff0c;因此我这里在网上搜索并参考了下 “&#x1f525; LeetCode 热题 HOT 100” 的题型归类&#xff0c;并在其基础上做了一定的完善&#xff0c;希望能够记录自己的刷题历程&#xff0c;有所收获&#xff01;点击下发…

点滴生活记录2

我从小跟着我爷爷奶奶&#xff0c;小学六年级转到县城上小学&#xff0c;就没跟我奶奶他们住一起了。十一回家&#xff0c;把奶奶接到我这住&#xff0c;细想&#xff0c;自六年级之后&#xff0c;就很少跟奶奶住一起了。 奶奶&#xff08;间歇性&#xff09;耳聋&#xff0c;为…

软件测试相关

软件测试是什么&#xff1f; 使用人工和自动手段来运行或测试某个系统的过程&#xff0c;其目的在于验证它是否满足规定的需求或弄清预期结果与实际结果的差别。 为什么做软件测试&#xff1f;目的是什么&#xff1f; 发现软件存在的代码或业务逻辑错误 检验产品是否符合用户需…