【Python】operator模块

Python中operator模块提供了一套与 Python 的内置运算符对应的高效率函数。

不仅对应内置运算符,还可以获取方法。可优化涉及回调函数的运算性能,比lambda、Python函数的开销小、速度快。

import operator

[x for x in dir(operator) if not x.startswith('_')]
# 结果:
['abs', 'add', 'and_', 'attrgetter', 'call', 'concat', 'contains', 'countOf', 
'delitem', 'eq', 'floordiv', 'ge', 'getitem', 'gt', 'iadd', 'iand', 'iconcat',
 'ifloordiv', 'ilshift', 'imatmul', 'imod', 'imul', 'index', 'indexOf', 'inv', 
'invert', 'ior', 'ipow', 'irshift', 'is_', 'is_not', 'isub', 'itemgetter', 
'itruediv', 'ixor', 'le', 'length_hint', 'lshift', 'lt', 'matmul', 'methodcaller',
 'mod', 'mul', 'ne', 'neg', 'not_', 'or_', 'pos', 'pow', 'rshift', 'setitem', 
'sub', 'truediv', 'truth', 'xor']

from operator import *

1、数学运算

注意:数字不可变。因此,原地运算符,会被计算,但不会被赋值,不改变原变量的数字。

函数对应运算符描述举例
add(a,b)a + b 相加add(2,3)  结果:5
iadd(a,b)a += b相加,原地运算符

a = 5

iadd(a,3)    结果:8
a     结果:5

sub(a,b)a - b 相减sub(2,3)  结果:-1
isub(a,b)a -= b相减,原地运算符
mul(a,b)a * b 相乘mul(2,3)  结果:6
imul(a,b)a *= b相乘,原地运算符
truediv(a,b)a / b 相除truediv(2,3)  结果:0.6666666666666666
itruediv(a,b)a /= b相除,原地运算符
floordiv(a,b)a // b 相除取整数floordiv(2,3)  结果:0
ifloordiv(a,b)a //= b相除取整数,原地运算符
mod(a,b)a % b 相除取余数mod(2,3)  结果:2
imod(a,b)a %= b相除取余数,原地运算符
pow(a,b)a ** b 幂,a^{b}pow(2,3)  结果:8
ipow(a,b)a **= b幂,原地运算符
matmul(a,b)a @ b 矩阵乘法
imatmul(a,b)a @= b矩阵乘法,原地运算符
neg(a)- a 算术取反neg(1)   结果:-1
pos(a)+ a 取正pos(-1)  结果:-1
abs(a)绝对值abs(-1)   结果:1
函数对应运算符描述举例
inv(a),  invert(a)按位取反,等价于 ~ a inv(2)   结果:-3
invert(2)   结果:-3
lshift(a,b)a << b 左移 lshift(2,3)  结果:16
ilshift(a,b)a <<= b左移,原地运算符
rshift(a,b)a >> b 右移rshift(2,3)  结果:0
irshift(a,b)a >>= b右移,原地运算符
and_(a,b)a & b 按位与 and_(2,3)   结果:2
iand(a,b)a &= b按位与,原地运算符
or_(a,b)a | b 按位或or_(2,3)   结果:3
ior(a,b)即 a |= b按位或,原地运算符
xor(a,b)a ^ b 按位异或xor(2,3)  结果:1
ixor(a,b)a ^= b按位异或,原地运算符

注解:(假设8位二进制,最高位为符号位,负数用补码形式存储)

① 按位取反。inv(2)   结果:-3

2(二进制:00000010):按位取反,则11111101(原码10000011,十进制:-3)。

② 左移。lshift(2,3)  结果:16

2(二进制:00000010):左移3位,则00010000(十进制:16)。

③ 按位与。and_(2,3)   结果:2

2(二进制:00000010),3(二进制:00000011):按位与,则00000010(十进制:2)。

按位与:1 & 1 = 1,1 & 0 = 0,0 & 0 = 0

按位或:1 | 1 = 1,1 | 0 = 1,0 | 0 = 0

按位异或:1 ^ 1 = 0,1 ^ 0 = 1,0 ^ 0 = 0

2、比较运算

函数对应运算符描述举例
lt(a,b)a < b 小于lt(2,3)   结果:True
le(a,b)a <= b 小于等于le(2,3)  结果:True
gt(a,b)a > b 大于gt(2,3)  结果:False
ge(a,b)a >= b 大于等于ge(2,3)  结果:False
eq(a,b)a == b 等于eq(2,3)   结果:False
ne(a,b)a  != b 不等于ne(2,3)  结果:True

lt:less than   小于

le:less than or equal to   小于等于

gt:greater than   大于

ge:greater than or equal to   大于等于

eq:equal to   等于

ne:not equal to   不等于​​​​​​​

3、逻辑运算

函数对应运算符描述举例
truth(a)a真值测试。a 为真,返回True,否则返回Falsetruth(0)  结果:False
not_(a)not a逻辑取反not_(0)  结果:True
is_(a,b)a is ba 是 b
is_not(a,b)a is not ba 不是 b

4、序列运算

注意:原地运算符中被赋值的序列需是可变的。若不可变的序列(字符串、元组),会计算但不会赋值,即不改变原序列。

函数对应运算符描述举例
concat(a,b)a + b 序列a、b,拼接concat([1],[2,3])  结果:[1, 2, 3]
iconcat(a,b)a += b序列a、b,拼接,原地运算符
contains(a,b)b in a序列a 中包含元素bcontains("hello","e")   结果:True
countOf(a,b)序列a 中元素b出现的次数countOf("hello","l")   结果:2
indexOf(a,b)序列a 中元素b第一次出现的位置。若不存在,则报错indexOf("hello","o")   结果:4
getitem(a,b)a[b] 序列a 中获取下标/切片b对应的元素getitem("hello",1)   结果:'e'
getitem("hello",slice(1,3))   结果:'el'
setitem(a,b,c)a[b]=c可变序列a 中赋值下标/切片b对应的元素为ca = [1,2,3]; setitem(a,2,"w"); a   结果:[1, 2, 'w']
a = [1,2,3]; setitem(a,slice(1,3),["w","y"]); a   结果:[1, 'w', 'y']
delitem(a,b)del a[b]可变序列a 中删除下标/切片b对应的元素a = [1,2,3]; delitem(a,1); a    结果:[1, 3]
a = [1,2,3]; delitem(a,slice(1,3)); a    结果:[1]
length_hint(a)len(a)序列a的长度length_hint("hello")    结果:5

add 和 iadd 也可以拼接序列,和concat结果相同。

函数对应运算符描述举例
add(a,b)a + b 序列a、b,拼接add([1],[2,3])   结果:[1, 2, 3]
iadd(a,b)a += b序列a、b,拼接,原地运算符

5、3.11 新版功能

提供了快速访问对象的属性、获取序列元素、方法调用。

适合作为快速提取器(map, sorted, itertools.groupby等)的参数。

(5-1)attrgetter  【访问对象的属性】

  • attrgetter(属性)(对象):对象.属性,即获取对象的属性。
  • attrgetter(属性1, 属性2 ...)(对象):(对象.属性1, 对象.属性2,...),即获取对象的多个属性,返回元组形式。
from operator import *

class People(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age

p1 = People("Tom",18)
p2 = People("Jack",25)

get_age = attrgetter("age")
get_age(p1)                                   # 结果:18
get_age(p2)                                   # 结果:25
# 相当于         
p1.age                                        # 结果:18
p2.age                                        # 结果:25
         
get_all = attrgetter("name","age")
get_all(p1)                                   # 结果:('Tom', 18)
get_all(p2)                                   # 结果:('Jack', 25)
# 相当于
p1.name,p1.age                                # 结果:('Tom', 18)
p2.name,p2.age                                # 结果:('Jack', 25)

# attrgetter 比 lambda 速度快
list(map(get_age,[p1,p2]))                    # 结果:[18, 25]
# 相当于
list(map(lambda x:x.age,[p1,p2]))             # 结果:[18, 25]

list(map(get_all,[p1,p2]))                    # 结果:[('Tom', 18), ('Jack', 25)]
# 相当于  
list(map(lambda x:(x.name,x.age),[p1,p2]))    # 结果:[('Tom', 18), ('Jack', 25)]

(5-2)itemgetter  【获取序列的元素】

  • itemgetter(下标)(序列) :序列[下标],即获取序列中下标对应的元素。
  • itemgetter(slice(起始下标, 结束下标))(序列):序列[起始下标:结束下标],通过切片获取序列中的元素。
  • itemgetter(下标1, 下标2, ...)(序列) :(序列[下标1],序列[下标2],...),即获取序列中多个下标对应的元素,返回元组形式。
from operator import *

a = "hello"
itemgetter(1)(a)                  # 结果:'e'
itemgetter(slice(1,4))(a)         # 结果:'ell'
itemgetter(1,2,4)(a)              # 结果:('e', 'l', 'o')
  •  itemgetter(键)(字典) :字典[键],通过键获取字典中的值。
  •  itemgetter(键1, 键2,...)(字典) :(字典[键1], 字典[键2], ...),通过多个键获取字典中的值,返回元组形式。
from operator import *

d = {'一季度':20,'二季度':50,'三季度':15,'四季度':35}
itemgetter('二季度')(d)                     # 结果:50
itemgetter('二季度','四季度')(d)            # 结果:(50, 35)

在sorted、map等使用时,itemgetter 比 lambda 速度快。

from operator import *

b = [("一季度",20),("二季度",50),("三季度",15),("四季度",35)]
# 按元组中下标为1的元素大小排序
sorted(b,key=itemgetter(1))       # 结果:[('三季度', 15), ('一季度', 20), ('四季度', 35), ('二季度', 50)]
# 相当于
sorted(b,key=lambda x:x[1])       # 结果:[('三季度', 15), ('一季度', 20), ('四季度', 35), ('二季度', 50)]

# 获取元组中下标为1的元素
list(map(itemgetter(1),b))        # 结果:[20, 50, 15, 35]
# 相当于
list(map(lambda x:x[1],b))        # 结果:[20, 50, 15, 35]

(5-3)methodcaller  【调用对象的方法】

  • methodcaller(方法)(对象):对象.方法(),即调用对象的方法。
  • methodcaller(方法, 参数1, 参数2 ...)(对象):对象.方法(参数1, 参数2,...),即调用对象的方法,并传递参数。
from operator import *

class People(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def introduce(self):
        return f"我是{self.name}"

p1 = People("Tom",18)

intro = methodcaller("introduce")
intro(p1)                              # 结果:'我是Tom'
# 相当于
p1.introduce()                         # 结果:'我是Tom'

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】-文件系统的详解以及软硬链接

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

实现高值医疗耗材智能化管理的RFID医疗柜解决方案

一、行业背景 医疗物资管理面临着一系列问题&#xff0c;如高值耗材种类激增导致准入标准弱化、信息追踪困难、管理责任不明确等&#xff0c;医院内部设备、财务和临床科室相互独立&#xff0c;兼容性不佳&#xff0c;高值耗材储备不足&#xff0c;缺乏合理的预警机制&#xf…

卡尔曼家族从零解剖-(06) 一维卡尔曼滤波编程(c++)实践、透彻理解公式结果

讲解关于slam一系列文章汇总链接:史上最全slam从零开始&#xff0c;针对于本栏目讲解的 卡尔曼家族从零解剖 链接 :卡尔曼家族从零解剖-(00)目录最新无死角讲解&#xff1a;https://blog.csdn.net/weixin_43013761/article/details/133846882 文末正下方中心提供了本人 联系…

go语言学习之旅之go语言基础语法

学无止境&#xff0c;今天学习go语言的基础语法 行分隔符 在 Go 程序中&#xff0c;一行代表一个语句结束。没有结束符号 注释 注释不会被编译&#xff0c;每一个包应该有相关注释。 单行注释是最常见的注释形式&#xff0c;你可以在任何地方使用以 // 开头的单行注释。多…

淘宝账单导出的手工操作

文章目录 淘宝账单导出的手工操作概述笔记END 淘宝账单导出的手工操作 概述 日常的支付(JD, 淘宝, 1688), 最终都是用微信和支付宝来支付. 微信和支付宝是绑定的自己银行卡. JD绑定的也是自己的银行卡. 微信账单的导出, 已经记录了, 好使. 现在记录一下支付宝账单(只要是阿…

Jetson orin部署大模型示例教程

一、LLM介绍 LLM指的是Large Language Model&#xff08;大型语言模型&#xff09;&#xff0c;是一类基于深度学习的自然语言处理技术&#xff0c;其主要目的是让机器能够更好地理解和生成人类的自然语言文本&#xff0c;如文章、对话、搜索等。 教程 - text-generation-web…

类加载器(classloader)

作者&#xff1a;ZeaTalk 链接&#xff1a;https://www.zhihu.com/question/49667892/answer/690161827 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 类加载器&#xff08;classloader&#xff09; 先从类加载器…

如何使用AO交易和保护头寸,澳福3个指标轻松搞定

进入市场的第二个重要信号是基于投资者已经熟悉的令人敬畏的振荡器&#xff0c;称为AO。其工作原理类似于著名的MACD指示器&#xff0c;衡量市场的即时势头。它是一个5日均线减去34日均线。该指示器以红色和绿色柱状图的形式呈现&#xff0c;绿色柱状图表示市场势头向上&#x…

【Docker安装】windows系统安装docker

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、下载exe安装文件二、选择虚拟方式1.wsl2方式2.Hyper-V 三、启动docker Engine 守护进程1.启动docker 服务2.初始化守护进程 四、设置…

SpringBoot和Spring源码下载

1.下载&#xff1a;在一个空的干净地创建一个文件夹叫springsourcecode&#xff0c;其实叫什么都行的。 git clone https://github.com/spring-projects/spring-framework.git 2.JDK要和gradle匹配 我们要21的&#xff0c;今天为止2023年11月13日&#xff0c;idea是2023.2。 …

海报设计必备!五个免费网站分享,让你的创意得以充分展现!

海报作为一种重要的宣传工具&#xff0c;在各种场合得到了广泛的应用。然而&#xff0c;对许多人来说&#xff0c;制作一张漂亮的海报并不容易。幸运的是&#xff0c;有许多免费的海报制作网站可以帮助人们轻松地制作出漂亮的海报。本文将分享五个优秀的免费海报制作网站。 1.…

Power Apps-使用power Automate流

创建&#xff1a;Power Automate-创建power Apps使用的流-CSDN博客 打开Power Apps&#xff0c;创建页面&#xff0c;添加三个输入框&#xff08;分别是换算前单位、换算后单位、货币数&#xff09;&#xff0c;和一个文本框&#xff08;输出结果&#xff09;以及一个按钮 在…

天软特色因子看板 (2023.11 第10期)

该因子看板跟踪天软特色因子A05006(近一月单笔流入流出金额之比(%)该因子为近一个月单笔流入流出金额之比(%)均值因子&#xff0c;用以刻画 市场日内分时成交中流入、流出成交金额的差异性特点&#xff0c;发掘市场主力资金的作用机制。 今日为该因子跟踪第10期&#xff0c;跟踪…

qtcreator中其他控件的使用

scroll area 是 Tool Box是 tabwidget是网页 这三个可以用进行连接 用按钮实现切换 combo box的使用 使用label添加图片动图

Postman接口Mock Servier服务器

近期在复习Postman的基础知识&#xff0c;在小破站上跟着百里老师系统复习了一遍&#xff0c;也做了一些笔记&#xff0c;希望可以给大家一点点启发。 应用场景&#xff1a;后端的接口还没有开发完成&#xff0c;前端的业务需要调用后端的接口&#xff0c;可以使用mock模拟。 一…

csrf学习笔记总结

跨站请求伪造csrf csrf概述 掌握CSRF 漏洞原理 掌握CSRF 漏洞场景 掌握CSRF 漏洞验证 csrf原理 ​ 跨站请求伪造&#xff08;Cross Site Request Forgery&#xff0c;CSRF&#xff09;是一种攻击&#xff0c;它强制浏览器客户端用户在当前对其进行身份验证后的Web 应用程…

基于安卓android微信小程序的食谱大全系统

项目介绍 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个开发过程首先对食谱大全进行需求分析&#xff0c;得出食谱大全主要功能。接着对食谱大全进行总体设计和详细设计。总体设…

利用网络管理解决方案简化网络运维

当今的网络正朝着提高敏捷性和动态功能的方向发展&#xff0c;以支持高级网络要求和关键业务流程&#xff0c;这导致 IT 基础架构也跨越无线、虚拟和混合环境。但是&#xff0c;随着网络的快速发展&#xff0c;如果没有合适的解决方案&#xff0c;IT 管理员很难管理它们&#x…

【功能栏】基于session的模拟短信注册功能

框架&#xff1a; spring boot mybatis-plus 目录 1.创建user表 ​编辑2. mybatis-plus插件 3.导入相关依赖 4.配置文件 5.前端代码 register.html style.css 6.后端代码 entity层 mapper层 sevice层 业务层接口 业务层实现类 controller层 7.调试 1. 未输…

【案例】由coredump引起的思考:程序的加载流程

背景 小米项目的同事&#xff0c;最近遇到了一个crash问题&#xff0c;困扰较久&#xff0c;向我请求帮助。&#xff08;其实是客户指定要求我来分析这个问题&#xff0c;该项目之前是由我负责的&#xff0c;帮客户解决很多较多crash问题。估计是实力得到了客户认可吧&#xff…