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标准库笔记(11) — itertools模块

Python标准库笔记(11) — Operator模块的更多相关文章

  1. Python标准库笔记(10) — itertools模块

    itertools 用于更高效地创建迭代器的函数工具. itertools 提供的功能受Clojure,Haskell,APL和SML等函数式编程语言的类似功能的启发.它们的目的是快速有效地使用内存, ...

  2. Python标准库笔记(9) — functools模块

    functools 作用于函数的函数 functools 模块提供用于调整或扩展函数和其他可调用对象的工具,而无需完全重写它们. 装饰器 partial 类是 functools 模块提供的主要工具, ...

  3. Python标准库笔记(8) — pprint模块

    struct模块提供了用于在字节字符串和Python原生数据类型之间转换函数,比如数字和字符串. Python版本: 2.x & 3.x 该模块作用是完成Python数值和C语言结构体的Pyt ...

  4. python标准库介绍——8 operator 模块详解

    ==operator 模块== ``operator`` 模块为 Python 提供了一个 "功能性" 的标准操作符接口. 当使用 ``map`` 以及 ``filter`` 一类 ...

  5. Python 标准库笔记(1) — String模块

    原文出处: j_hao104 String模块包含大量实用常量和类,以及一些过时的遗留功能,并还可用作字符串操作. 1. 常用方法 常用方法 描述 str.capitalize() 把字符串的首字母大 ...

  6. Python标准库笔记(6) — struct模块

    该模块作用是完成Python数值和C语言结构体的Python字符串形式间的转换.这可以用于处理存储在文件中或从网络连接中存储的二进制数据,以及其他数据源. 用途: 在Python基本数据类型和二进制数 ...

  7. (转)Python 标准库笔记:string模块

    String模块包含大量实用常量和类,以及一些过时的遗留功能,并还可用作字符串操作. 原文:http://www.10tiao.com/html/384/201709/2651305041/1.htm ...

  8. Python标准库笔记(1) — string模块

    String模块包含大量实用常量和类,以及一些过时的遗留功能,并还可用作字符串操作. 1. 常用方法 常用方法 描述 str.capitalize() 把字符串的首字母大写 str.center(wi ...

  9. Python标准库笔记(5) — sched模块

    事件调度 sched模块内容很简单,只定义了一个类.它用来最为一个通用的事件调度模块. class sched.scheduler(timefunc, delayfunc)这个类定义了调度事件的通用接 ...

随机推荐

  1. centos 7下ldap安装

    环境说明: 操作系统:CentOS Linux release 7.5.1804 (Core) LDAP:2.4.44 前提条件: 关闭防火墙.selinux,同时进行时钟同步. 其中XXX需要用域名 ...

  2. [NOI2016]旷野大计算

    Subtask0 造计算机神题.给一个忠告:珍爱生命,远离旷野大计算...... 代码在这里:戳我 Subtask1 给定\(a,b\):求\(-2a-2b\). 熟悉操作环境:\([-(a+b)]& ...

  3. IoT与区块链的机遇与挑战

    区块链, 分布式账本技术的一种形式, 自从2014年或多或少地获得了大量的关注: 区块链和物联网, 区块链和安全, 区块链和金融, 区块链和物流, 凡是你能想到的,仿佛都可以应用区块链. 在本文中, ...

  4. BZOJ 4316: 小C的独立集 解题报告

    4316: 小C的独立集 Description 图论小王子小C经常虐菜,特别是在图论方面,经常把小D虐得很惨很惨. 这不,小C让小D去求一个无向图的最大独立集,通俗地讲就是:在无向图中选出若干个点, ...

  5. Redis事务介绍

    概述 相信学过Mysql等其他数据库的同学对事务这个词都不陌生,事务表示的是一组动作,这组动作要么全部执行,要么全部不执行.为什么会有这样的需求呢?看看下面的场景: 微博是一个弱关系型社交网络,用户之 ...

  6. C++11新特性——大括号初始化

    C++11之前,C++主要有以下几种初始化方式: //小括号初始化 string str("hello"); //等号初始化 string str="hello" ...

  7. Java之Java程序与虚拟机

    Java为什么要在虚拟机中运行 简单的来说,Java作为一门高级程序语言,语法复杂,抽象度高,不能直接翻译为机器码在机器上运行,所以设计者就设计了虚拟机,通过编译器将Java程序转换成虚拟机所能识别的 ...

  8. DataTables实现rowspan思路

    直接看例子吧 <table id="example" class="display table table-bordered" cellspacing=& ...

  9. (转)Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (三) —— SharePreferences

    除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data ...

  10. CodeForces475

    A. Splits #include <cstdio> #include <cstdlib> #include <cmath> #include <cstri ...