Python中operator模块的操作符使用示例总结


Posted in Python onJune 28, 2016

operator模块是python中内置的操作符函数接口,它定义了一些算术和比较内置操作的函数。operator模块是用c实现的,所以执行速度比python代码快。

逻辑操作

from operator import *

a = [1, 2, 3]
b = a
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)

打印结果:

a = [1, 2, 3]
b = [1, 2, 3]
not_(a)   : False
truth(a)  : True
is_(a, b)  : True
is_not(a, b): False

可以通过结果知道,operator的一些操作函数与原本的运算是相同的。

比较操作符
operator提供丰富的比较操作。

a = 3
b = 5
print 'a =', a
print 'b =', b
print 

for func in (lt, le, eq, ne, ge, gt):
  print '{0}(a, b):'.format(func.__name__), func(a, b)

打印结果

a = 3
b = 5

lt(a, b): True
le(a, b): True
eq(a, b): False
ne(a, b): True
ge(a, b): False
gt(a, b): False

这些函数等价于<、<=、==、>=和>的表达式语法。

算术操作符
处理数字的算术操作符也得到支持。

a, b, c, d = -1, 2, -3, 4

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)

打印结果

a = -1
b = 2
c = -3
d = 4

Positive/Negative:
abs(a): 1
neg(a): 1
neg(b): -2
pos(a): -1
pos(b): 2

abs返回值得绝对值,neg返回(-obj), pos返回(+obj)。

a = -2
b = 5.0

print 'a =', a
print 'b =', b
 
print '\nArithmetic'
print 'add(a, b)    :', add(a, b)
print 'div(a, b)    :', div(a, b)
print 'floordiv(a, b)  :', floordiv(a, b)
print 'mod(a, b)    :', mod(a, b)
print 'mul(a, b)    :', mul(a, b)
print 'pow(a, b)    :', pow(a, b)
print 'sub(a, b)    :', sub(a, b)
print 'truediv(a, b)  :', truediv(a, b)

打印结果

a = -2
b = 5.0

Arithmetic
add(a, b)    : 3.0
div(a, b)    : -0.4
floordiv(a, b)  : -1.0
mod(a, b)    : 3.0 # 查看负数取模
mul(a, b)    : -10.0
pow(a, b)    : -32.0
sub(a, b)    : -7.0
truediv(a, b)  : -0.4

mod表示取模, mul 表示相乘,pow是次方, sub表示相减

a = 2
b = 6

print 'a =', a
print 'b =', b

print '\nBitwise:'
print 'and_(a, b)  :', and_(a, b)
print 'invert(a)  :', invert(a)
print 'lshift(a, b) :', lshift(a, b)
print 'or_(a, b)  :', or_(a, b)
print 'rshift(a, b) :', rshift(a, b)
print 'xor(a, b)  :', xor(a, b)

打印结果

a = 2
b = 6

Bitwise:
and_(a, b)  : 2
invert(a)  : -3
lshift(a, b) : 128
or_(a, b)  : 6
rshift(a, b) : 0
xor(a, b)  : 4

and 表示按位与, invert 表示取反操作, lshift表示左位移, or表示按位或, rshift表示右位移,xor表示按位异或。

原地操作符
即in-place操作, x += y 等同于 x = iadd(x, y), 如果复制给其他变量比如z = iadd(x, y)等同与z = x; z += y。

a = 3
b = 4
c = [1, 2]
d = ['a', 'b']

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

属性和元素的获取方法
operator模块最特别的特性之一就是获取方法的概念,获取方法是运行时构造的一些可回调对象,用来获取对象的属性或序列的内容,获取方法在处理迭代器或生成器序列的时候特别有用,它们引入的开销会大大降低lambda或Python函数的开销。

from operator import *
class MyObj(object):
  def __init__(self, arg):
    super(MyObj, self).__init__()
    self.arg = arg
  def __repr__(self):
    return 'MyObj(%s)' % self.arg

objs = [MyObj(i) for i in xrange(5)]
print "Object:", objs

g = attrgetter("arg")
vals = [g(i) for i in objs]
print "arg values:", vals

objs.reverse()
print "reversed:", objs
print "sorted:", sorted(objs, key=g)

结果:

Object: [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, n='attrname':getattr(x,nz)

元素获取方法类似于

lambda x,y=5:x[y]
from operator import *

l = [dict(val=-1*i) for i in xrange(4)]
print "dictionaries:", l
g = itemgetter("val")
vals = [g(i) for i in l]
print "values: ", vals
print "sorted:", sorted(l, key=g)

l = [(i,i*-2) for i in xrange(4)]
print "tuples: ", l
g = itemgetter(1)
vals = [g(i) for i in l]
print "values:", vals
print "sorted:", sorted(l, key=g)

结果如下:

dictionaries: [{'val': 0}, {'val': -1}, {'val': -2}, {'val': -3}]
values: [0, -1, -2, -3]
sorted: [{'val': -3}, {'val': -2}, {'val': -1}, {'val': 0}]
tuples: [(0, 0), (1, -2), (2, -4), (3, -6)]
values: [0, -2, -4, -6]
sorted: [(3, -6), (2, -4), (1, -2), (0, 0)]

除了序列之外,元素获取方法还适用于映射。

结合操作符和定制类
operator模块中的函数通过相应操作的标准Python接口完成工作,所以它们不仅适用于内置类型,还适用于用户自定义类型。

from operator import *

class MyObj(object):
  def __init__(self, val):
    super(MyObj, self).__init__()
    self.val = val
    return 

  def __str__(self):
    return "MyObj(%s)" % self.val

  def __lt__(self, other):
    return self.val < other.val

  def __add__(self, other):
    return MyObj(self.val + other.val)

a = MyObj(1)
b = MyObj(2)

print lt(a, b)
print add(a,b)

结果如下所示:

True
MyObj(3)

类型检查
operator 模块还包含一些函数用来测试映射、数字和序列类型的API兼容性。

from operator import *

class NoType(object):
  pass

class MultiType(object):
  def __len__(self):
    return 0

  def __getitem__(self, name):
    return "mapping"

  def __int__(self):
    return 0

o = NoType()
t = MultiType()

for func in [isMappingType, isNumberType, isSequenceType]:
  print "%s(o):" % func.__name__, func(o)
  print "%s(t):" % func.__name__, func(t)

结果如下:

isMappingType(o): False
isMappingType(t): True
isNumberType(o): False
isNumberType(t): True
isSequenceType(o): False
isSequenceType(t): True

但是这些测试并不完善,因为借口没有严格定义。

获取对象方法
使用methodcaller可以获取对象的方法。

from operator import methodcaller

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

  def getName(self):
    return self.name

stu = Student("Jim")
func = methodcaller('getName')
print func(stu)  # 输出Jim

还可以给方法传递参数:

f=methodcaller('name', 'foo', bar=1)
f(b)  # return  b.name('foo', bar=1)
methodcaller方法等价于下面这个函数:

def methodcaller(name, *args, **kwargs):
   def caller(obj):
      return getattr(obj, name)(*args, **kwargs)
   return caller
Python 相关文章推荐
python文件和目录操作方法大全(含实例)
Mar 12 Python
Python实现方便使用的级联进度信息实例
May 05 Python
ubuntu中配置pyqt4环境教程
Dec 27 Python
Python 网络爬虫--关于简单的模拟登录实例讲解
Jun 01 Python
python中计算一个列表中连续相同的元素个数方法
Jun 29 Python
python cs架构实现简单文件传输
Mar 20 Python
python 处理微信对账单数据的实例代码
Jul 19 Python
将Pytorch模型从CPU转换成GPU的实现方法
Aug 19 Python
Flask和pyecharts实现动态数据可视化
Feb 26 Python
Python网页解析器使用实例详解
May 30 Python
python 基于卡方值分箱算法的实现示例
Jul 17 Python
Python读取xlsx数据生成图标代码实例
Aug 12 Python
基础的十进制按位运算总结与在Python中的计算示例
Jun 28 #Python
Python中的with语句与上下文管理器学习总结
Jun 28 #Python
深入解析Python中的上下文管理器
Jun 28 #Python
详解Python中contextlib上下文管理模块的用法
Jun 28 #Python
实例讲解Python中SocketServer模块处理网络请求的用法
Jun 28 #Python
Python中asyncore异步模块的用法及实现httpclient的实例
Jun 28 #Python
python 字典(dict)按键和值排序
Jun 28 #Python
You might like
Re:从零开始的异世界生活 第2季 开播啦
2020/07/24 日漫
PHP个人网站架设连环讲(一)
2006/10/09 PHP
php提示undefined index的几种解决方法
2012/05/21 PHP
Php-Redis安装测试笔记
2015/03/05 PHP
twig里使用js变量的方法
2016/02/05 PHP
php array_keys 返回数组的键名
2016/10/25 PHP
thinkphp5修改view到根目录实例方法
2019/07/02 PHP
PHP面向对象程序设计中的self、static、parent关键字用法分析
2019/08/14 PHP
动态创建的表格单元格中的事件实现代码
2008/12/30 Javascript
10个基于Jquery的幻灯片插件教程
2010/10/29 Javascript
html向js方法传递参数具体实现
2013/08/08 Javascript
JS保存和删除cookie操作 判断cookie是否存在
2013/11/13 Javascript
jquery背景跟随鼠标滑动导航
2015/11/20 Javascript
javascript正则表达式模糊匹配IP地址功能示例
2017/01/06 Javascript
原生JS实现几个常用DOM操作API实例
2017/01/19 Javascript
jquery对象与DOM对象转化
2017/02/08 Javascript
vue基于Vue2.0和高德地图的地图组件实例
2017/04/28 Javascript
element el-input directive数字进行控制
2018/10/11 Javascript
小程序实现人脸识别功能(百度ai)
2018/12/23 Javascript
基于Vue实现平滑过渡的拖拽排序功能
2019/06/12 Javascript
JavaScript(js)处理的HTML事件、键盘事件、鼠标事件简单示例
2019/11/19 Javascript
Python实现将文本生成二维码的方法示例
2017/07/18 Python
python opencv之SURF算法示例
2018/02/24 Python
对numpy中的transpose和swapaxes函数详解
2018/08/02 Python
django解决跨域请求的问题
2018/11/11 Python
Python3按一定数据位数格式处理bin文件的方法
2019/01/24 Python
python绘制双Y轴折线图以及单Y轴双变量柱状图的实例
2019/07/08 Python
Python 使用threading+Queue实现线程池示例
2019/12/21 Python
浅谈pymysql查询语句中带有in时传递参数的问题
2020/06/05 Python
如何验证python安装成功
2020/07/06 Python
opencv 形态学变换(开运算,闭运算,梯度运算)
2020/07/07 Python
FitFlop澳大利亚官网:英国符合人体工学的鞋类品牌
2017/06/05 全球购物
寒假实习自荐信
2014/01/26 职场文书
机械设备与数控技术专业求职信
2014/08/10 职场文书
2015年财务个人工作总结范文
2015/05/22 职场文书
解决Swagger2返回map复杂结构不能解析的问题
2021/07/02 Java/Android