百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

python系列(operator-内置运算符的功能接口)

off999 2024-10-17 11:46 87 浏览 0 评论

使用迭代器进行编程有时需要为简单表达式创建小函数。有时,这些可以作为lambda函数实现,但对于某些操作,根本不需要新函数。该operator模块定义了与算术,比较和与标准对象API相对应的其他操作的内置操作相对应的函数。

逻辑运算

有一些函数可以确定一个值的布尔等价,否定它来创建相反的布尔值,并比较对象以查看它们是否相同。

operator_boolean.py

from operator import *
a = -1
b = 5
print('a =', a)
print('b =', b)
print()
print('not_(a) :', not_(a))
print('truth(a) :', truth(a))
print('is_(a, b) :', is_(a, b))
print('is_not(a, b):', is_not(a, b))

not_()包括尾随下划线,因为它not 是一个Python关键字。 truth()应用在if语句中测试表达式或将表达式转换为a 时使用的相同逻辑bool。 is_()实现is关键字使用的相同检查,并is_not()进行相同的测试并返回相反的答案。

$ python3 operator_boolean.py
a = -1
b = 5
not_(a) : False
truth(a) : True
is_(a, b) : False
is_not(a, b): True

比较运算符

支持所有丰富的比较运算符。

operator_comparisons.py

from operator import *
a = 1
b = 5.0
print('a =', a)
print('b =', b)
for func in (lt, le, eq, ne, ge, gt):
 print('{}(a, b): {}'.format(func.__name__, func(a, b)))

的功能是等同于使用表达式语法<, <=,==,>=,和>。

$ python3 operator_comparisons.py
a = 1
b = 5.0
lt(a, b): True
le(a, b): True
eq(a, b): False
ne(a, b): True
ge(a, b): False
gt(a, b): False

算术运算符

还支持用于操纵数值的算术运算符。

operator_math.py

from operator import *
a = -1
b = 5.0
c = 2
d = 6
print('a =', a)
print('b =', b)
print('c =', c)
print('d =', d)
print('\nPositive/Negative:')
print('abs(a):', abs(a))
print('neg(a):', neg(a))
print('neg(b):', neg(b))
print('pos(a):', pos(a))
print('pos(b):', pos(b))
print('\nArithmetic:')
print('add(a, b) :', add(a, b))
print('floordiv(a, b):', floordiv(a, b))
print('floordiv(d, c):', floordiv(d, c))
print('mod(a, b) :', mod(a, b))
print('mul(a, b) :', mul(a, b))
print('pow(c, d) :', pow(c, d))
print('sub(b, a) :', sub(b, a))
print('truediv(a, b) :', truediv(a, b))
print('truediv(d, c) :', truediv(d, c))
print('\nBitwise:')
print('and_(c, d) :', and_(c, d))
print('invert(c) :', invert(c))
print('lshift(c, d):', lshift(c, d))
print('or_(c, d) :', or_(c, d))
print('rshift(d, c):', rshift(d, c))
print('xor(c, d) :', xor(c, d))

有两个独立的除法运算符:( floordiv()在3.0之前的Python中实现的整数除法)和 truediv()(浮点除法)。

$ python3 operator_math.py
a = -1
b = 5.0
c = 2
d = 6
Positive/Negative:
abs(a): 1
neg(a): 1
neg(b): -5.0
pos(a): -1
pos(b): 5.0
Arithmetic:
add(a, b) : 4.0
floordiv(a, b): -1.0
floordiv(d, c): 3
mod(a, b) : 4.0
mul(a, b) : -5.0
pow(c, d) : 64
sub(b, a) : 6.0
truediv(a, b) : -0.2
truediv(d, c) : 3.0
Bitwise:
and_(c, d) : 2
invert(c) : -3
lshift(c, d): 128
or_(c, d) : 6
rshift(d, c): 1
xor(c, d) : 4

序列运算符

使用序列的运算符可以分为四组:构建序列,搜索项目,访问内容以及从序列中删除项目。

operator_sequences.py

from operator import *
a = [1, 2, 3]
b = ['a', 'b', 'c']
print('a =', a)
print('b =', b)
print('\nConstructive:')
print(' concat(a, b):', concat(a, b))
print('\nSearching:')
print(' contains(a, 1) :', contains(a, 1))
print(' contains(b, "d"):', contains(b, "d"))
print(' countOf(a, 1) :', countOf(a, 1))
print(' countOf(b, "d") :', countOf(b, "d"))
print(' indexOf(a, 5) :', indexOf(a, 1))
print('\nAccess Items:')
print(' getitem(b, 1) :',
 getitem(b, 1))
print(' getitem(b, slice(1, 3)) :',
 getitem(b, slice(1, 3)))
print(' setitem(b, 1, "d") :', end=' ')
setitem(b, 1, "d")
print(b)
print(' setitem(a, slice(1, 3), [4, 5]):', end=' ')
setitem(a, slice(1, 3), [4, 5])
print(a)
print('\nDestructive:')
print(' delitem(b, 1) :', end=' ')
delitem(b, 1)
print(b)
print(' delitem(a, slice(1, 3)):', end=' ')
delitem(a, slice(1, 3))
print(a)

其中一些操作(例如setitem()和delitem())修改了序列并且不返回值。

$ python3 operator_sequences.py
a = [1, 2, 3]
b = ['a', 'b', 'c']
Constructive:
 concat(a, b): [1, 2, 3, 'a', 'b', 'c']
Searching:
 contains(a, 1) : True
 contains(b, "d"): False
 countOf(a, 1) : 1
 countOf(b, "d") : 0
 indexOf(a, 5) : 0
Access Items:
 getitem(b, 1) : b
 getitem(b, slice(1, 3)) : ['b', 'c']
 setitem(b, 1, "d") : ['a', 'd', 'c']
 setitem(a, slice(1, 3), [4, 5]): [1, 4, 5]
Destructive:
 delitem(b, 1) : ['a', 'c']
 delitem(a, slice(1, 3)): [1]

就地操作员

除了标准运算符之外,许多类型的对象还支持通过特殊运算符进行“就地”修改 +=。同样具有就地修改的功能:

operator_inplace.py

from operator import *
a = -1
b = 5.0
c = [1, 2, 3]
d = ['a', 'b', 'c']
print('a =', a)
print('b =', b)
print('c =', c)
print('d =', d)
print()
a = iadd(a, b)
print('a = iadd(a, b) =>', a)
print()
c = iconcat(c, d)
print('c = iconcat(c, d) =>', c)

这些示例仅演示了一些功能。有关完整的详细信息,请参阅标准库文档。

$ python3 operator_inplace.py
a = -1
b = 5.0
c = [1, 2, 3]
d = ['a', 'b', 'c']
a = iadd(a, b) => 4.0
c = iconcat(c, d) => [1, 2, 3, 'a', 'b', 'c']

属性和项目“获取者”

该operator模块最不寻常的特征之一是吸气剂的概念。这些是在运行时构造的可调用对象,用于从序列中检索对象或内容的属性。在使用迭代器或生成器序列时,getter特别有用,它们的开销比lambdaPython函数要少。

operator_attrgetter.py

from operator import *
class MyObj:
 """example class for attrgetter"""
 def __init__(self, arg):
 super().__init__()
 self.arg = arg
 def __repr__(self):
 return 'MyObj({})'.format(self.arg)
l = [MyObj(i) for i in range(5)]
print('objects :', l)
# Extract the 'arg' value from each object
g = attrgetter('arg')
vals = [g(i) for i in l]
print('arg values:', vals)
# Sort using arg
l.reverse()
print('reversed :', l)
print('sorted :', sorted(l, key=g))

属性getter的工作方式如下:lambda x, n='attrname': getattr(x, n)

$ python3 operator_attrgetter.py
objects : [MyObj(0), MyObj(1), MyObj(2), MyObj(3), MyObj(4)]
arg values: [0, 1, 2, 3, 4]
reversed : [MyObj(4), MyObj(3), MyObj(2), MyObj(1), MyObj(0)]
sorted : [MyObj(0), MyObj(1), MyObj(2), MyObj(3), MyObj(4)]

项目干将一样工作:lambda x, y=5: x[y]

operator_itemgetter.py

from operator import *
l = [dict(val=-1 * i) for i in range(4)]
print('Dictionaries:')
print(' original:', l)
g = itemgetter('val')
vals = [g(i) for i in l]
print(' values:', vals)
print(' sorted:', sorted(l, key=g))
print()
l = [(i, i * -2) for i in range(4)]
print('\nTuples:')
print(' original:', l)
g = itemgetter(1)
vals = [g(i) for i in l]
print(' values:', vals)
print(' sorted:', sorted(l, key=g))

项目获取者使用映射和序列。

$ python3 operator_itemgetter.py
Dictionaries:
 original: [{'val': 0}, {'val': -1}, {'val': -2}, {'val': -3}]
 values: [0, -1, -2, -3]
 sorted: [{'val': -3}, {'val': -2}, {'val': -1}, {'val': 0}]
Tuples:
 original: [(0, 0), (1, -2), (2, -4), (3, -6)]
 values: [0, -2, -4, -6]
 sorted: [(3, -6), (2, -4), (1, -2), (0, 0)]

组合运算符和自定义类

operator模块中的函数通过标准Python接口进行操作,因此它们可以使用用户定义的类以及内置类型。

operator_classes.py

from operator import *
class MyObj:
 """Example for operator overloading"""
 def __init__(self, val):
 super(MyObj, self).__init__()
 self.val = val
 def __str__(self):
 return 'MyObj({})'.format(self.val)
 def __lt__(self, other):
 """compare for less-than"""
 print('Testing {} < {}'.format(self, other))
 return self.val < other.val
 def __add__(self, other):
 """add values"""
 print('Adding {} + {}'.format(self, other))
 return MyObj(self.val + other.val)
a = MyObj(1)
b = MyObj(2)
print('Comparison:')
print(lt(a, b))
print('\nArithmetic:')
print(add(a, b))

有关每个运算符使用的特殊方法的完整列表,请参阅Python参考指南。

$ python3 operator_classes.py
Comparison:
Testing MyObj(1) < MyObj(2)
True
Arithmetic:
Adding MyObj(1) + MyObj(2)
MyObj(3)

相关推荐

Alist 玩家请进:一键部署全新分支 Openlist,看看香不香!

Openlist(其前身是鼎鼎大名的Alist)是一款功能强大的开源文件列表程序。它能像“万能钥匙”一样,解锁并聚合你散落在各处的云盘资源——无论是阿里云盘、百度网盘、GoogleDrive还是...

白嫖SSL证书还自动续签?这个开源工具让我告别手动部署

你还在手动部署SSL证书?你是不是也遇到过这些问题:每3个月续一次Let'sEncrypt证书,忘了就翻车;手动配置Nginx,重启服务,搞一次SSL得花一下午;付费证书太贵,...

Docker Compose:让多容器应用一键起飞

CDockerCompose:让多容器应用一键起飞"曾经我也是一个手动启动容器的少年,直到我的膝盖中了一箭。"——某位忘记--link参数的运维工程师引言:容器化的烦恼与...

申请免费的SSL证书,到期一键续签

大家好,我是小悟。最近帮朋友配置网站HTTPS时发现,还有人对宝塔面板的SSL证书功能还不太熟悉。其实宝塔早就内置了免费的Let'sEncrypt证书申请和一键续签功能,操作简单到连新手都能...

飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx

前面分享了两期TVGate:Q大的转发代理工具TVGate升级了,操作更便捷,增加了新的功能跨平台内网转发神器TVGate部署与使用初体验现在项目已经开源,并支持Docker部署,本文介绍如何通...

Docker Compose 编排实战:一键部署多容器应用!

当项目变得越来越复杂,一个服务已经无法满足需求时,你可能需要同时部署数据库、后端服务、前端网页、缓存组件……这时,如果还一个一个手动dockerrun,简直是灾难这就是DockerCompo...

深度测评:Vue、React 一键部署的神器 PinMe

不知道大家有没有这种崩溃瞬间:领导突然要看项目Demo,客户临时要体验新功能,自己写的小案例想发朋友圈;找运维?排期?还要走工单;自己买服务器?域名、SSL、Nginx、防火墙;本地起服务?断电、关...

超简单!一键启动多容器,解锁 Docker Compose 极速编排秘籍

想要用最简单的方式在本地复刻一套完整的微服务环境?只需一个docker-compose.yml文件,你就能一键拉起N个容器,自动组网、挂载存储、环境隔离,全程无痛!下面这份终极指南,教你如何用...

日志文件转运工具Filebeat笔记_日志转发工具

一、概述与简介Filebeat是一个日志文件转运工具,在服务器上以轻量级代理的形式安装客户端后,Filebeat会监控日志目录或者指定的日志文件,追踪读取这些文件(追踪文件的变化,不停的读),并将来自...

K8s 日志高效查看神器,提升运维效率10倍!

通常情况下,在部署了K8S服务之后,为了更好地监控服务的运行情况,都会接入对应的日志系统来进行检测和分析,比如常见的Filebeat+ElasticSearch+Kibana这一套组合...

如何给网站添加 https_如何给网站添加证书

一、简介相信大家都知道https是更加安全的,特别是一些网站,有https的网站更能够让用户信任访问接下来以我的个人网站五岁小孩为例子,带大家一起从0到1配置网站https本次配置的...

10个Linux文件内容查看命令的实用示例

Linux文件内容查看命令30个实用示例详细介绍了10个Linux文件内容查看命令的30个实用示例,涵盖了从基本文本查看、分页浏览到二进制文件分析的各个方面。掌握这些命令帮助您:高效查看各种文本文件内...

第13章 工程化实践_第13章 工程化实践课

13.1ESLint+Prettier代码规范统一代码风格配置//.eslintrc.jsmodule.exports={root:true,env:{node...

龙建股份:工程项目中标_龙建股份有限公司招聘网

404NotFoundnginx/1.6.1【公告简述】2016年9月8日公告,公司于2016年9月6日收到苏丹共和国(简称“北苏丹”)喀土穆州基础设施与运输部公路、桥梁和排水公司出具的中标通知书...

福田汽车:获得政府补助_福田 补贴

404NotFoundnginx/1.6.1【公告简述】2016年9月1日公告,自2016年8月17日至今,公司共收到产业发展补助、支持资金等与收益相关的政府补助4笔,共计5429.08万元(不含...

取消回复欢迎 发表评论: