Python函数式编程(三)操作符函数(operator)

operator 模块提供了一套与Python的内置运算符对应的高效率函数。例如,operator.add(x, y) 与表达式 x+y 相同。 许多函数名与特殊方法名相同,只是没有双下划线。为了向后兼容性,也保留了许多包含双下划线的函数。为了表述清楚,建议使用没有双下划线的函数。
函数包含的种类有:对象的比较运算、逻辑运算、数学运算以及序列运算。
对象比较函数适用于所有的对象,函数名根据它们对应的比较运算符命名。

操作符函数

操作符表达式含义
operator.lt(ab)a<b
operator.le(ab)a<=b
operator.eq(ab)a==b
operator.ne(ab)a!=b
operator.gt(ab)a>b
operator.ge(ab)a>=b
operator.not_(obj)not obj
operator.truth(obj)bool(obj)
operator.is_(ab)a is b
operator.is_not(ab)a is not b
operator.abs(obj)abs(obj)
operator.pos(obj)+obj
operator.neg(obj)-obj
operator.add(ab)a+b
operator.sub(ab)a-b
operator.mul(ab)a*b
operator.truediv(ab)a/b
operator.floordiv(ab)a//b
operator.mod(ab)a%b
operator.pow(ab)a**b
operator.and_(ab)a&b
operator.or_(ab)a|b
operator.xor(ab)a^b
operator.matmul(ab)a@b

operator.inv(obj)

operator.invert(obj)

~obj
operator.lshift(ab)a<<b
operator.rshift(ab)a>>b
operator.index(a)index(a)
operator.concat(ab)a+b
operator.contains(ab)b in a
operator.countOf(ab)count(a,b)返回 b 在 a 中的出现次数
operator.delitem(ab)del a[b]
operator.getitem(ab)a[b]
operator.indexOf(ab)返回 b 在 a 中首次出现所在的索引号。
operator.setitem(abc)a[b]=c
operator.length_hint(objdefault=0)len(obj)
operator.call(obj/*args**kwargs)obj(*args, **kwargs)

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)

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

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)

operator.iadd(ab)a += b
operator.isub(ab)a -= b
operator.imul(ab)a *= b
operator.itruediv(ab)a /= b
operator.ifloordiv(ab)a //= b
operator.imod(ab)a %= b
operator.ipow(ab)a **= b
operator.iconcat(ab)a += b
operator.ilshift(ab)a <<= b
operator.irshift(ab)a >>= b
operator.imatmul(ab)a @= b
operator.iand(ab)a &= b
operator.ior(ab)a |= b
operator.ixor(ab)a ^= b
import operator
import functoolsprint(operator.le(10, 20)) #True
print(operator.add(10, 20)) #30numlist = [1,2,3,4,5,6,7,8]
result = map(operator.add, numlist, numlist)
print(list(result)) #[2, 4, 6, 8, 10, 12, 14, 16]
result = functools.reduce(operator.mul, numlist)
print(result) #40320

对象属性提取attrgetter

attrgetter 类可以获取对象的属性用于 map(), stored()等高阶函数 操作

import operator
import functoolsclass Student:def __init__(self, name, age):self.name = nameself.age = agedef __repr__(self):return f'({self.name=}, {self.age=})'slist = [Student('Alice', 15), Student('Bibe', 16), Student('Chen', 12), Student('Jack', 13)]#按年龄排序
print(sorted(slist, key=operator.attrgetter('age')))
#按姓名排序
print(sorted(slist, key=operator.attrgetter('name')))‘’'
[(self.name='Chen', self.age=12), (self.name='Jack', self.age=13), (self.name='Alice', self.age=15), (self.name='Bibe', self.age=16)]
[(self.name='Alice', self.age=15), (self.name='Bibe', self.age=16), (self.name='Chen', self.age=12), (self.name='Jack', self.age=13)]
‘''

对象方法提取methodcaller

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)

import operator
import functoolsclass Student:def __init__(self, name, age):self.name = nameself.age = agedef __repr__(self):return f'({self.name=}, {self.age=})'def isPupil(self):if self.age >=6 and self.age < 12:return Truereturn Falseslist = [Student('Alice', 6), Student('Bibe', 8), Student('Chen', 12), Student('Jack', 9)]print(list(filter(operator.methodcaller('isPupil'), slist)))
#[(self.name='Alice', self.age=6), (self.name='Bibe', self.age=8), (self.name='Jack', self.age=9)]

下标获取itemgetter

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

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

 

 

将运算符映射到函数

运算

语法

函数

加法

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)

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

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

相关文章

跳转传参的方式

在Web开发中&#xff0c;跳转传参的方式有以下几种&#xff1a; 1.查询字符串(Query String)&#xff1a;通过URL的查询字符串传递参数。可以在URL后面添加?符号&#xff0c;然后以键值对的形式传递参数&#xff0c;不同参数之间使用&符号分隔。 示例&#xff1a; // 跳…

node版本问题:Error: error:0308010C:digital envelope routines::unsupported

前言 出现这个错误是因为 node.js V17及以后版本中最近发布的OpenSSL3.0, 而OpenSSL3.0对允许算法和密钥大小增加了严格的限制,可能会对生态系统造成一些影响. 在node.js V17以前一些可以正常运行的的应用程序,但是在 V17 及以后版本可能会抛出以下异常: 我重装系统前,用的…

三个要点,掌握Spring Boot单元测试

单元测试是软件开发中不可或缺的重要环节&#xff0c;它用于验证软件中最小可测试单元的准确性。结合运用Spring Boot、JUnit、Mockito和分层架构&#xff0c;开发人员可以更便捷地编写可靠、可测试且高质量的单元测试代码&#xff0c;确保软件的正确性和质量。 一、介绍 本文…

【自学记录】深度学习入门——基于Python的理论与实现(第4章 神经网络的学习)

4.2 损失函数 #损失函数 #均方误差 def mean_squared_error(y,t):return 0.5*np.sum((y-t)**2) #交叉熵误差 def _cross_entropy_error(y,t):delta1e-7return -np.sum(t*np.log(ydelta))#交叉熵损失函数 def cross_entropy_error(y,t):if y.ndim1:tt.reshape(1,t.size)yy.resh…

Lua学习笔记:require非.lua拓展名的文件

前言 本篇在讲什么 Lua的require相关的内容 本篇需要什么 对Lua语法有简单认知 对C语法有简单认知 依赖Visual Studio工具 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手 提供全流程的源码内容 ★提高阅读体验★ &#x1f449; ♠…

uni-app 之 短信验证码登录

uni-app 之 短信验证码登录 image.png image.png <template><view style"width: 100%; display: flex; flex-direction:column; align-items:center;"><view style"width: 300px; margin-top: 100px;"><!-- // --><!-- 1&#…

uni-app:实现密码框内容展示与隐藏

效果 代码 <template><view class"container"><view class"item_left"><view>密码</view><view class"eye_position" taptoggleShowPassword><image :srceye v-ifisShowPassword /><image :srcey…

DBRichEdit关联ClientDataSet不能保存的Bug

ClientDataSet的最大好处&#xff0c;就是建立能内存表&#xff0c;特别DataSnap三层运用中&#xff0c;主要使用ClientDataSet与运程的服务器中的数据表&#xff0c;建立读取存贮关系。 在软件的使用中&#xff0c;总有客户反映&#xff0c;一些数据不能保存。 发现都是使用DB…

Springboot中使用拦截器、过滤器、监听器

一、Servlet、Filter&#xff08;过滤器&#xff09;、 Listener&#xff08;监听器&#xff09;、Interceptor&#xff08;拦截器&#xff09; Javaweb三大组件&#xff1a;servlet、Filter&#xff08;过滤器&#xff09;、 Listener&#xff08;监听器&#xff09; Spring…

nodejs在pdf中绘制表格

需求 之前我已经了解过如何在pdf模板中填写字段了 nodejs根据pdf模板填入中文数据并生成新的pdf文件https://blog.csdn.net/ArmadaDK/article/details/132456324 但是当我具体使用的时候&#xff0c;我发现我的模板里面有表格&#xff0c;表格的长度是不固定的&#xff0c;所…

Bluespec SytemVerilog 握手协议接口转换

01、引言 由于接口控制信号上的差异&#xff0c;要实现Bluespec SystemVerilog(BSV)生成的代码和外部Verilog代码之间的正确交互是一件比较麻烦同时容易出错的事情。在BSV中, 模块之间的交互都是基于Action或ActionValue这两类method完成。下图展示了使用BSV设计的某一模块的接…

git 误删分支恢复方法

在使用git的过程中&#xff0c;因为人为因素造成分支&#xff08;commit)被删除&#xff0c;可以使用以下步骤进行恢复。 首先用以下步骤创建一个新分支&#xff0c;修改一些文件后删除&#xff0c;以便进行恢复。 1.创建分支 abc git branch abc2.查看分支列表 git branch …

深度学习在图像识别领域还有哪些应用?

深度学习在图像识别领域的应用非常广泛&#xff0c;除了之前提到的图像分类、目标检测、语义分割和图像生成&#xff0c;还有其他一些应用。 图像超分辨率重建&#xff1a;深度学习技术可以用于提高图像的分辨率&#xff0c;例如通过使用生成对抗网络&#xff08;GAN&#xff…

RK3588安装python3.11(ubuntu18.04)

1.前言 看到rknn_toolkit_lite2更新了python3.11的安装包&#xff0c;马上更新一下 2.RK3588安装python3.11 Ubuntu上编译Python 3.11&#xff0c;您可以按照以下步骤进行操作&#xff1a; (1) 准备编译环境 在开始之前&#xff0c;确保您的系统已安装必要的编译工具和依赖项…

【JavaEE】HTML

JavaWeb HTML 超文本标记语言 超文本&#xff1a;文本、声音、图片、视频、表格、连接标记&#xff1a;有许许多多的标签组成 vscode开发工具搭建 因为我使用的IDEA是社区版&#xff0c;代码高亮补全缩进都有些问题&#xff0c;使用vscode是最好的选择~ 安装 Visual Stu…

聊聊并发编程——并发容器和阻塞队列

目录 一.ConcurrentHashMap 1.为什么要使用ConcurrentHashMap&#xff1f; 2.ConcurrentHashMap的类图 3.ConcurrentHashMap的结构图 二.阻塞队列 Java中的7个阻塞队列 ArrayBlockingQueue&#xff1a;一个由数组结构组成的有界阻塞队列。 LinkedBlockingQueue&#xf…

jvm笔记

好处&#xff1a; 跨平台 内存管理机制&#xff0c;垃圾回收功能 数组下标越界检查 多态 名词解释&#xff1a; jvm java虚拟机&#xff0c;是java程序的运行环境 jre jvm基础类库 jdk jre编译工具 javase jdkide工具 javaee javase应用服务器 jvm的内存结构&#xff1a; 程序…

FPGA 图像缩放 千兆网 UDP 网络视频传输,基于RTL8211 PHY实现,提供工程和QT上位机源码加技术支持

目录 1、前言版本更新说明免责声明 2、相关方案推荐UDP视频传输--无缩放FPGA图像缩放方案我这里已有的以太网方案 3、设计思路框架视频源选择ADV7611 解码芯片配置及采集动态彩条跨时钟FIFO图像缩放模块详解设计框图代码框图2种插值算法的整合与选择 UDP协议栈UDP视频数据组包U…

Flink中的状态一致性

1.概念 一致性其实就是结果的正确性。对于分布式系统而言&#xff0c;从不同节点读取时总能得到相同的值&#xff1b;而对于事务而言&#xff0c;是要求提交更新操作后&#xff0c;能够读取到新的数据。 有状态的流处理&#xff0c;内部每个算子任务都可以有自己的状态。对于流…

Source Insight 工具栏图标功能介绍

这篇文章并不介绍 Source Insight 的具体使用方法&#xff0c;这类教程网上有很多&#xff0c;这里只分析 Souce Insight 工具栏图标的功能。 文章目录 Source Insight 简介Souce Insight 工具栏文件操作新建&#xff08;CtrlN&#xff09;打开&#xff08;CtrlO&#xff09;保…