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 tempfile模块学习笔记(临时文件)
May 25 Python
寻找网站后台地址的python脚本
Sep 01 Python
Python3.x版本中新的字符串格式化方法
Apr 24 Python
详解Python中heapq模块的用法
Jun 28 Python
python按行读取文件,去掉每行的换行符\n的实例
Apr 19 Python
浅谈django rest jwt vue 跨域问题
Oct 26 Python
python使用配置文件过程详解
Dec 28 Python
Python callable内置函数原理解析
Mar 05 Python
使用Python+selenium实现第一个自动化测试脚本
Mar 17 Python
Python基于callable函数检测对象是否可被调用
Oct 16 Python
Django haystack实现全文搜索代码示例
Nov 28 Python
Python+unittest+DDT实现数据驱动测试
Nov 30 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
收听短波不可能有声音清晰的品质吗
2021/03/01 无线电
php empty函数判断mysql表单是否为空
2010/04/12 PHP
PHP网站备份程序代码分享
2011/06/10 PHP
探讨如何在php168_cms中提取验证码
2013/06/08 PHP
PHP实现生成唯一编号(36进制的不重复编号)
2014/07/01 PHP
PHP数组函数array_multisort()用法实例分析
2016/04/02 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
原生js拖拽(第一课 未兼容)拖拽思路
2013/03/29 Javascript
给html超链接设置事件不使用href来完成跳
2014/04/20 Javascript
嵌入式iframe子页面与父页面js通信的方法
2015/01/20 Javascript
jquery 插件实现瀑布流图片展示实例
2015/04/03 Javascript
Bootstrap基础学习
2015/06/16 Javascript
js简单实现标签云效果实例
2015/08/06 Javascript
基于JavaScript实现添加到购物车效果附源码下载
2016/08/22 Javascript
JavaScript实现解析INI文件内容的方法
2016/11/17 Javascript
laydate.js日期时间选择插件
2017/01/04 Javascript
jQuery查找和过滤_动力节点节点Java学院整理
2017/07/04 jQuery
jQuery Autocomplete简介_动力节点Java学院整理
2017/07/17 jQuery
python基于右递归解决八皇后问题的方法
2015/05/25 Python
python判断一个集合是否包含了另外一个集合中所有项的方法
2015/06/30 Python
Python实现文件复制删除
2016/04/19 Python
python 将列表中的字符串连接成一个长路径的方法
2018/10/23 Python
Python+OpenCV+图片旋转并用原底色填充新四角的例子
2019/12/12 Python
如何在sublime编辑器中安装python
2020/05/20 Python
CSS3中的注音对齐属性ruby-align用法指南
2016/07/01 HTML / CSS
CSS3实现文字波浪线效果示例代码
2016/11/20 HTML / CSS
HTML5 Blob对象的具体使用
2020/05/22 HTML / CSS
新加坡网上化妆品店:Best Buy World
2018/05/18 全球购物
香港彩色隐形眼镜在线商店:Stunninglens(全球免费送货)
2019/05/10 全球购物
Java的五个基础面试题
2016/02/26 面试题
编写一个类体现构造,公有,私有方法,静态,私有变量
2013/08/10 面试题
成功经营餐厅的创业计划书范文
2013/12/26 职场文书
结婚喜宴家长答谢词
2014/01/15 职场文书
销售竞赛活动方案
2014/08/23 职场文书
老兵退伍感言
2015/08/03 职场文书
诺贝尔奖获得者名言100句:句句启人心智,值永久收藏
2019/08/09 职场文书