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

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

1.逻辑操作符(Logical Operations)

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

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关键字。true()使用的逻辑和if语句加表达式或将表达式转换为bool.is_()时相同的逻辑。is_()实现的是使用is关键字相同的检查,is_not()也执行相同的检查但返回相反的结果。

a = -1

b = 5

not_(a) : False

truth(a) : True

is_(a, b) : False

is_not(a, b): True

2.比较操作符(Comparison Operators)

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

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)))

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

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

3.算术操作符(Arithmetic Operators)

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

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('\n正数/负数:')

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('\n算术:')

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('\n按位:')

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()(浮点除法)。

a = -1

b = 5.0

c = 2

d = 6

正数/负数:

abs(a): 1

neg(a): 1

neg(b): -5.0

pos(a): -1

pos(b): 5.0

算术:

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

按位:

and_(c, d) : 2

invert(c) : -3

lshift(c, d): 128

or_(c, d) : 6

rshift(d, c): 1

xor(c, d) : 4

4.序列操作符(Sequence Operators)

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

from operator import *

a = [1, 2, 3]

b = ['a', 'b', 'c']

print('a =', a)

print('b =', b)

print('\n构建序列:')

print(' concat(a, b):', concat(a, b))

print('\n搜索:')

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('\n访问:')

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('\n删除:')

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(),修改序列时属于原地操作,不返回值。

a = [1, 2, 3]

b = ['a', 'b', 'c']

构建序列:

concat(a, b): [1, 2, 3, 'a', 'b', 'c']

搜索:

contains(a, 1) : True

contains(b, "d"): False

countOf(a, 1) : 1

countOf(b, "d") : 0

indexOf(a, 5) : 0

访问:

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]

删除:

delitem(b, 1) : ['a', 'c']

delitem(a, slice(1, 3)): [1]

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

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

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()

iadd(a, b)

print('a = iadd(a, b) =>', a)

print()

iconcat(c, d)

print('c = iconcat(c, d) =>', c)

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

a = -1

b = 5.0

c = [1, 2, 3]

d = ['a', 'b', 'c']

a = iadd(a, b) => -1

c = iconcat(c, d) => [1, 2, 3, 'a', 'b', 'c']

6.属性和内容"Getters"

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

from operator import *

class MyObj:

"""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)

# 从每个对象中提取'arg'属性

g = attrgetter('arg')

vals = [g(i) for i in l]

print('arg values:', vals)

# 使用arg排序

l.reverse()

print('reversed :', l)

print('sorted :', sorted(l, key=g))

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

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)]

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

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))

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

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)]

7.自定义类中使用

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

from operator import *

class MyObj:

"""重载操作符例子"""

def __init__(self, val):

super(MyObj, self).__init__()

self.val = val

def __str__(self):

return 'MyObj({})'.format(self.val)

def __lt__(self, other):

"""小于比较"""

print('Testing {} < {}'.format(self, other))

return self.val < other.val

def __add__(self, other):

"""add操作"""

print('Adding {} + {}'.format(self, other))

return MyObj(self.val + other.val)

a = MyObj(1)

b = MyObj(2)

print('比较操作:')

print(lt(a, b))

print('\n算术运算:')

print(add(a, b))

比较操作:

Testing MyObj(1) < MyObj(2)

True

算术运算:

Adding MyObj(1) + MyObj(2)

MyObj(3)

不属于python标准库的是_Python标准库笔记(11) — Op相关推荐

  1. python扩展库丰富吗_python扩展库

    python更新所有的包 1 2 3 4 5 6 7 8> import pip > from subprocess import call > > package_list_ ...

  2. python random库怎么用_Python || Random库的使用

    点击上方蓝字关注"程序员Bob"呀~ 每日一句,送给最珍贵的你: 人们内心的恐惧,有部分来自于过去事实所造成的伤害,但另一部分,却是源自我们对恐惧的想像和无限放大. 在C语言我们可 ...

  3. python的标准类型内建函数有_python标准内建函数_python 内建函数(四)

    转自 http://www.cnblogs.com/mangood/p/6013741.html 内建函数都在 _builtins_ 里面 (1)abs() 取绝对值 adb(-10) 10 (2)b ...

  4. python 删除csv第一行_python 标准库学习之 csv

    本文由作者 凭海临风 授权刊登.原文地址:https://jeffsui.github.io/2020/01/02/python-standard-library-csv/ 文档路径 官方文档:htt ...

  5. python random包含尾部吗_Python标准库random的方法randint(m,n)用来生成一个[m,n]区间上的随机整数。...

    [判断题]已知列表 x = [1, 2, 3],那么执行语句 x = 3 之后,变量x的地址不变 [判断题]只能对列表进行切片操作,不能对元组和字符串进行切片操作 [单选题]Which is not ...

  6. python中标准库有哪些_python标准库有哪些

    详细内容 了解更多关于python标准库的知识,可以点击:Python教程 操作系统接口 os模块提供了不少与操作系统相关联的函数.>>> import os >>> ...

  7. 不属于python标准库的是_python标准库和扩展库

    Tkinter ---- Python 默认的图形界面接口. Tkinter 是一个和 Tk 接口的模块, Tkinter 库提供 了对 Tk API 的接口,它属于 Tcl/Tk 的 GUI 工具组 ...

  8. python标准库使用教程_Python标准库概览

    总结 这个部分讲了一些常用的python库的方法.一下子也记不住,不过基本都自己敲了代码试了试. os模块 os模块介绍了一些操作系统级别的方法 os.getcwd():得到当前工作目录 os.chd ...

  9. python标准库模块教程_Python标准库之Sys模块使用详解

    sys 模块提供了许多函数和变量来处理 Python 运行时环境的不同部分. 处理命令行参数 在解释器启动后, argv 列表包含了传递给脚本的所有参数, 列表的第一个元素为脚本自身的名称. 使用sy ...

最新文章

  1. 论排列组合,持续更新
  2. 10.14.2 快捷键,环境变量等
  3. 操作系统上机作业--多线程排序
  4. 菜鸟学习笔记:Java提升篇5(IO流1——IO流的概念、字节流、字符流、缓冲流、转换流)
  5. 孩子学习缺乏主动性,应该怎么做?
  6. Ubuntu下安装Git以及Git帮助手册【转】
  7. 计算机考研 东华大学,东华大学(专业学位)计算机技术考研难吗
  8. jquery消息插件(jquery.messager.js)
  9. 深入出不来nodejs源码-从fs.stat方法来看node架构
  10. Quartus II软件的使用
  11. linux下安装zmap和zgrab
  12. 服务器价格指导 7月四路机架产品选购
  13. 腾达ac5第三方固件_腾达AC9的刷固件指南
  14. 华东师范大学2020计算机研究生招生简章,2020华东师范大学计算机考研大纲
  15. Windows xp .iso下载大全——超全面超难找的收藏版(一)
  16. KeyShot中的半透明材质怎样来创建液体
  17. linux如何卸载wps,Ubuntu菜鸟入门(三)—— 无用软件卸载,wps等常用软件安装...
  18. InterValue正式启动主网映射
  19. 网络工程师成长日记138-前途迷茫和年龄无关
  20. 推荐好书《追风筝的人》

热门文章

  1. java验证iap支付收据
  2. 多张照片拼成另一个照片-想制作一个不一样的惊喜?还得用这款神器 AndreaMosaic,我们就叫它拼凑图片神器
  3. 3dmax:3dmax三维VR渲染设置之高级灯光渲染(经典案例—利用自由聚光灯制作筒灯效果效果)图文教程
  4. 低代码平台无极(wj)系列(一):从低代码服务到0代码的应用背景
  5. android图文并排仿朋友圈,Android之仿微信发朋友圈图片选择功能
  6. win8右下角网络图标不见了_笔记本连接wifi的图标不见了怎么办_win8右下角wifi图标不见了的解决方法...
  7. cv2保存的图片是什么?RGB or BGR
  8. 基于 KU115+MPSOC 的 6U VPX 高速信号处理板(XCKU115 + ZU9EG +DSP)
  9. 邮件退信回执原因分析
  10. UESTC 1546 Bracket Sequence