视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Python中operator模块的操作符使用
2020-11-27 14:26:14 责编:小采
文档


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 '
Positive/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 '
Arithmetic'
print 'add(a, b) :', add(a, b)
print 'p(a, b) :', p(a, b)
print 'floorp(a, b) :', floorp(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 'truep(a, b) :', truep(a, b)

打印结果

a = -2
b = 5.0

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

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

a = 2
b = 6

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

print '
Bitwise:'
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中operator模块的操作符使用相关文章请关注PHP中文网!

下载本文
显示全文
专题