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

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