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

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

off999 2024-10-17 11:46 94 浏览 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)

相关推荐

戴尔官网保修查询入口(戴尔售后保质期查询)

可以按照以下步骤查询戴尔笔记本电脑的保修期:1.打开戴尔官网:https://www.戴尔.com/zh-cn/售后服务/保修政策.html2.点击页面上方的“服务与支持”按钮,进入戴尔的服务支持...

手机号邮箱登录入口(手机号邮箱官网)

手机163邮箱登录入口如下:163邮箱官网入口:https://smart.mail.163.com/login.htm点击进入登录或者注册邮箱即可。手机浏览器访问进入官网http://www.123...

sd卡(sd卡无法读取怎么修复)

  SD卡是大卡,相机用的;普通的手机内存卡,是小卡,正规的名称是macrosd卡,也就是微型SD卡。可以通过卡套转为普通的SD卡的大小。  其实就是大小不同。但手机上的内存卡,人们经常也俗称为SD...

路由器连接图(网络路由器连接图)
  • 路由器连接图(网络路由器连接图)
  • 路由器连接图(网络路由器连接图)
  • 路由器连接图(网络路由器连接图)
  • 路由器连接图(网络路由器连接图)
windows7蓝牙功能在哪里打开

点击搜索框在windows7系统主界面点击开始菜单,点击打开搜索框。输入命令输入services.msc后回车,在列表中找到并右击BluetoothSupportS...点击属性选择进入属性菜单,...

2010激活密钥(microsoft2010激活密钥)
2010激活密钥(microsoft2010激活密钥)

步骤/方式1officeprofessionalplus2010:(office专业版)6QFdx-pYH2G-ppYFd-C7RJM-BBKQ8Bdd3G-xM7FB-Bd2HM-YK63V-VQFdKVYBBJ-TRJpB-QFQ...

2025-11-19 04:03 off999

联想官方刷新bios工具(联想电脑刷新bios)

刷新BIOS需要使用联想的官方网站或授权维修中心来进行操作。以下是一些基本步骤:1.访问联想的官方网站,找到BIOS更新程序并下载。在下载过程中,请确保选择与您计算机型号匹配的版本。2.将下载的B...

苹果ios14系统下载(苹果ios14.1下载)
苹果ios14系统下载(苹果ios14.1下载)

1方法一步骤/方式一打开Appstore。步骤/方式二在搜索栏点击搜索框。步骤/方式三搜索并点击需要下载的软件。步骤/方式四点击获取。步骤/方式五最后验证ID密码即可。1.在应用商店搜索你要下载的应用名称。2.点击下载按钮,如果要求登...

2025-11-19 03:03 off999

office2010怎么免费永久激活密钥

用这个试试,一个KMS激活工具可以激活2010到2019的Office自家的目前用的就是这个microsoft6477.moe/1716.html直接使用这个Microsoftoffice2010...

类似爱加速的国内ip(类似爱加速的app)
类似爱加速的国内ip(类似爱加速的app)

推荐“V8盒子”。这一款免费无广告的模拟器,不同于其它软件盒子,而是类似于X8沙箱,满足游戏多开,画中画,悬浮球操作,熄屏后台运行等多功能的沙箱盒子.支持一键root,一键安装xposed框架,能在安卓/苹果手机上运行多个安卓/ios虚拟系...

2025-11-19 02:03 off999

阿里旺旺手机客户端(阿里旺旺手机app)

手机淘宝的旺旺在打开商品后,会看到左下角有个旺旺的图标,点击就可以联系了。  阿里旺旺是将原先的淘宝旺旺与阿里巴巴贸易通整合在一起的一个新品牌。它是淘宝和阿里巴巴为商人量身定做的免费网上商务沟通软件,...

最纯净的pe装机工具(pe工具哪个纯净)

U盘装系统步骤:1.制作U盘启动盘。这里推荐大白菜U盘启动盘制作工具,在网上一搜便是。2.U盘启动盘做好了,我们还需要一个GHOST文件,可以从网上下载一个ghost版的XP/WIN7/WIN8系统,...

装一个erp系统多少钱(wms仓库管理软件)

现在主流有客户端ERP和云端ERP两种客户端通常一次买断,价格在万元左右,但是还有隐性费用,你需要支付服务器、数据管理员,此外如果系统需要更新维护,你还需要支付另外一笔不菲的费用。云端ERP:优势...

cad2014序列号和密钥永久(autocad2014序列号和密钥)

1在cad2014中修改标注样式后,需要将其保存2单击“样式管理器”按钮,在弹出的窗口中选择修改后的标注样式,然后单击“设置为当前”按钮,再单击“保存当前样式”按钮,将其保存为新的样式名称3为了...

qq修改密保手机号(qq修改密保手机号是什么意思)

QQ更改绑定的手机号码操作步骤如下:1、打开手机主界面,找到“QQ”软件点击打开。2、输入正确的QQ账户和密码登录到qq主界面。3、点击左上角的头像“图片”,进入到个人中心界面。4、进入到个人中心界面...

取消回复欢迎 发表评论: