Python标准库笔记(11) — Operator模块

Operator——标准功能性操作符接口.

代码中使用迭代器时,有时必须要为一个简单表达式创建函数。有些情况这些函数可以用一个lambda函数实现,但是对于某些操作,根本没必要去写一个新的函数。因此operator模块定义了一些函数,这些函数对应于算术、比较和其他与标准对象API对应的操作。

1.逻辑操作符(Logical Operations)

下面函数用于确定一个值的布尔等价值,或者否定它创建相反的布尔值,或比较对象确定它们是否相同。

1from operator import * 2 3a = -1 4b = 5 5 6print('a =', a) 7print('b =', b) 8print() 9 10print('not_(a) :', not_(a)) 11print('truth(a) :', truth(a)) 12print('is_(a, b) :', is_(a, b)) 13print('is_not(a, b):', is_not(a, b))

not_()后面有一个下划线,是因为not是Python关键字。true()使用的逻辑和if语句加表达式或将表达式转换为bool.is_()时相同的逻辑。is_()实现的是使用is关键字相同的检查,is_not()也执行相同的检查但返回相反的结果。

1a = -1 2b = 5 3 4not_(a) : False 5truth(a) : True 6is_(a, b) : False 7is_not(a, b): True

2.比较操作符(Comparison Operators)

它支持所有富比较操作符:

1from operator import * 2 3a = 1 4b = 5.0 5 6print('a =', a) 7print('b =', b) 8 9for func in (lt, le, eq, ne, ge, gt): 10 print('{}(a, b): {}'.format(func.__name__, func(a, b)))

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

1a = 1 2b = 5.0 3lt(a, b): True 4le(a, b): True 5eq(a, b): False 6ne(a, b): True 7ge(a, b): False 8gt(a, b): False

3.算术操作符(Arithmetic Operators)

它还支持用于操作数值的算术运算符:

1from operator import * 2 3a = -1 4b = 5.0 5c = 2 6d = 6 7 8print('a =', a) 9print('b =', b) 10print('c =', c) 11print('d =', d) 12 13print('\n正数/负数:') 14print('abs(a):', abs(a)) 15print('neg(a):', neg(a)) 16print('neg(b):', neg(b)) 17print('pos(a):', pos(a)) 18print('pos(b):', pos(b)) 19 20print('\n算术:') 21print('add(a, b) :', add(a, b)) 22print('floordiv(a, b):', floordiv(a, b)) 23print('floordiv(d, c):', floordiv(d, c)) 24print('mod(a, b) :', mod(a, b)) 25print('mul(a, b) :', mul(a, b)) 26print('pow(c, d) :', pow(c, d)) 27print('sub(b, a) :', sub(b, a)) 28print('truediv(a, b) :', truediv(a, b)) 29print('truediv(d, c) :', truediv(d, c)) 30 31print('\n按位:') 32print('and_(c, d) :', and_(c, d)) 33print('invert(c) :', invert(c)) 34print('lshift(c, d):', lshift(c, d)) 35print('or_(c, d) :', or_(c, d)) 36print('rshift(d, c):', rshift(d, c)) 37print('xor(c, d) :', xor(c, d))

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

1a = -1 2b = 5.0 3c = 2 4d = 6 5 6正数/负数: 7abs(a): 1 8neg(a): 1 9neg(b): -5.0 10pos(a): -1 11pos(b): 5.0 12 13算术: 14add(a, b) : 4.0 15floordiv(a, b): -1.0 16floordiv(d, c): 3 17mod(a, b) : 4.0 18mul(a, b) : -5.0 19pow(c, d) : 64 20sub(b, a) : 6.0 21truediv(a, b) : -0.2 22truediv(d, c) : 3.0 23 24按位: 25and_(c, d) : 2 26invert(c) : -3 27lshift(c, d): 128 28or_(c, d) : 6 29rshift(d, c): 1 30xor(c, d) : 4

4.序列操作符(Sequence Operators)

处理序列的操作符可以分为四种:构建序列、搜索条目、访问内容和从序列中删除条目:

1from operator import * 2 3a = [1, 2, 3] 4b = ['a', 'b', 'c'] 5 6print('a =', a) 7print('b =', b) 8 9print('\n构建序列:') 10print(' concat(a, b):', concat(a, b)) 11 12print('\n搜索:') 13print(' contains(a, 1) :', contains(a, 1)) 14print(' contains(b, "d"):', contains(b, "d")) 15print(' countOf(a, 1) :', countOf(a, 1)) 16print(' countOf(b, "d") :', countOf(b, "d")) 17print(' indexOf(a, 5) :', indexOf(a, 1)) 18 19print('\n访问:') 20print(' getitem(b, 1) :', 21 getitem(b, 1)) 22print(' getitem(b, slice(1, 3)) :', 23 getitem(b, slice(1, 3))) 24print(' setitem(b, 1, "d") :', end=' ') 25setitem(b, 1, "d") 26print(b) 27print(' setitem(a, slice(1, 3), [4, 5]):', end=' ') 28setitem(a, slice(1, 3), [4, 5]) 29print(a) 30 31print('\n删除:') 32print(' delitem(b, 1) :', end=' ') 33delitem(b, 1) 34print(b) 35print(' delitem(a, slice(1, 3)):', end=' ') 36delitem(a, slice(1, 3)) 37print(a) 38

其中一些操作,如setitem()delitem(),修改序列时属于原地操作,不返回值。

1a = [1, 2, 3] 2b = ['a', 'b', 'c'] 3 4构建序列: 5 concat(a, b): [1, 2, 3, 'a', 'b', 'c'] 6 7搜索: 8 contains(a, 1) : True 9 contains(b, "d"): False 10 countOf(a, 1) : 1 11 countOf(b, "d") : 0 12 indexOf(a, 5) : 0 13 14访问: 15 getitem(b, 1) : b 16 getitem(b, slice(1, 3)) : ['b', 'c'] 17 setitem(b, 1, "d") : ['a', 'd', 'c'] 18 setitem(a, slice(1, 3), [4, 5]): [1, 4, 5] 19 20删除: 21 delitem(b, 1) : ['a', 'c'] 22 delitem(a, slice(1, 3)): [1]

5.原地操作符(In-place Operators)

除了标准操作符之外,许多对象类型还支持通过特殊操作符(如+=)"原地"修改。原地操作符也有相同的功能:

1from operator import * 2 3a = -1 4b = 5.0 5c = [1, 2, 3] 6d = ['a', 'b', 'c'] 7print('a =', a) 8print('b =', b) 9print('c =', c) 10print('d =', d) 11print() 12 13iadd(a, b) 14print('a = iadd(a, b) =>', a) 15print() 16 17iconcat(c, d) 18print('c = iconcat(c, d) =>', c)

上面示例只演示了个别函数。有关详细信息,请参阅标准库文档

1a = -1 2b = 5.0 3c = [1, 2, 3] 4d = ['a', 'b', 'c'] 5 6a = iadd(a, b) => -1 7 8c = iconcat(c, d) => [1, 2, 3, 'a', 'b', 'c']

6.属性和内容"Getters"

operator模块最出众的特性之一就是getter的概念。这些是在运行时构造的可调用对象,用于从序列中检索对象属性或内容。getter在处理迭代器或生成器序列时特别有用,因为它们的开销要小于lambda和Python函数。

1from operator import * 2 3 4class MyObj: 5 """attrgetter 演示类""" 6 7 def __init__(self, arg): 8 super().__init__() 9 self.arg = arg 10 11 def __repr__(self): 12 return 'MyObj({})'.format(self.arg) 13 14 15l = [MyObj(i) for i in range(5)] 16print('objects :', l) 17 18# 从每个对象中提取'arg'属性 19g = attrgetter('arg') 20vals = [g(i) for i in l] 21print('arg values:', vals) 22 23# 使用arg排序 24l.reverse() 25print('reversed :', l) 26print('sorted :', sorted(l, key=g))

本例中的属性getters功能类似于:lambda x, n='attrname': getattr(x, n):

1objects : [MyObj(0), MyObj(1), MyObj(2), MyObj(3), MyObj(4)] 2arg values: [0, 1, 2, 3, 4] 3reversed : [MyObj(4), MyObj(3), MyObj(2), MyObj(1), MyObj(0)] 4sorted : [MyObj(0), MyObj(1), MyObj(2), MyObj(3), MyObj(4)] 5

而内容getters功能类似于lambda x, y=5: x[y]:

1from operator import * 2 3l = [dict(val=-1 * i) for i in range(4)] 4print('Dictionaries:') 5print(' original:', l) 6g = itemgetter('val') 7vals = [g(i) for i in l] 8print(' values:', vals) 9print(' sorted:', sorted(l, key=g)) 10 11print() 12l = [(i, i * -2) for i in range(4)] 13print('\nTuples:') 14print(' original:', l) 15g = itemgetter(1) 16vals = [g(i) for i in l] 17print(' values:', vals) 18print(' sorted:', sorted(l, key=g))

内容getters既可以处字典,也可以处理序列。

1Dictionaries: 2 original: [{'val': 0}, {'val': -1}, {'val': -2}, {'val': -3}] 3 values: [0, -1, -2, -3] 4 sorted: [{'val': -3}, {'val': -2}, {'val': -1}, {'val': 0}] 5 6 7Tuples: 8 original: [(0, 0), (1, -2), (2, -4), (3, -6)] 9 values: [0, -2, -4, -6] 10 sorted: [(3, -6), (2, -4), (1, -2), (0, 0)]

7.自定义类中使用

operator模块中的函数操作是通过标准的Python接口工作,因此它们也可以处理用户自定义的类和内置类型。

1from operator import * 2 3 4class MyObj: 5 """重载操作符例子""" 6 7 def __init__(self, val): 8 super(MyObj, self).__init__() 9 self.val = val 10 11 def __str__(self): 12 return 'MyObj({})'.format(self.val) 13 14 def __lt__(self, other): 15 """小于比较""" 16 print('Testing {} < {}'.format(self, other)) 17 return self.val < other.val 18 19 def __add__(self, other): 20 """add操作""" 21 print('Adding {} + {}'.format(self, other)) 22 return MyObj(self.val + other.val) 23 24 25a = MyObj(1) 26b = MyObj(2) 27 28print('比较操作:') 29print(lt(a, b)) 30 31print('\n算术运算:') 32print(add(a, b)) 33 34 35比较操作: 36Testing MyObj(1) < MyObj(2) 37True 38 39算术运算: 40Adding MyObj(1) + MyObj(2) 41MyObj(3)

转载请注明来源 Python标准库笔记(11) — itertools模块

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

Python3:sqlalchemy对mysql数据库操作,非sql语句

Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''