参考链接: Python中的Inplace运算符| 2(ixor(),iand(),ipow()等)

python进阶教程

          机器学习

          深度学习

          

          长按二维码关注

         

        

       

      

     

    

   

  

 

 

  

   

    

     

      

     

    

   

   

    

     

      

       进入正文

      

     

    

   

   

    

     

      

       

      

     

    

   

  

 

 

  

   

    

     

      

     

     Python基础学习:operator模块

    

   

  

 

 

  

   

    

    

     声明:functools, itertools, operator是Python标准库为我们提供的支持函数式编程的三大模块,合理的使用这三个模块,我们可以写出更加简洁可读的Pythonic代码,本次的系列文章将介绍并使用这些python自带的标准模块,系列文章分篇连载,此为第三篇,鉴于内容较多,介绍的都是operator库里面的一些常见操作,后面有几个方法涉及到高级操作,认真看哦。有兴趣的小伙伴后面记得关注学习哦!

     今天是假期第一天,各位小伙伴玩的开心的同时,也抽点时间搞搞学习哦,学习使我快乐!!!

    

    

     

    

   

  

 

 

  

   

   

   

    operator模块输出一系列对应Python内部操作符的函数。例如:operator.add(x, y)等价于表达式x+y。许多函数的名称都被一些特定的方法使用,没有下划线加持。为了向下兼容,它们中的许多都保留着由双下划线的变体。那些不具备双下划线的变体是为了使表达更清晰。

    这些函数在各种函数目录里扮演者对象比较、逻辑操作、数学运算以及序列操作等角色。

    

   

   

   

  

 

 

  

   

    

     

      

       

       

       

      

      

       目录

      

      

       

       

       

      

     

     

      

       1 常见的函数操作

       2 原址操作

       3 比较运算操作

       4 逻辑运算操作

       5 简单的数学操作与按位运算

       6 与序列有关的操作

       7 operator高级操作

          7.1 attrgetter函数

          7.2 itemgetter函数

          7.3 methodcaller函数

      

     

    

   

  

  

   

    

     01

    

    

     常见的函数操作

    

    

   

  <

  操作语法函数加法a + badd(a, b)连接seq1 + seq2concat(seq1, seq2)包含测试obj in seqcontains(seq, obj)除法a / btruediv(a, b)除法a // bfloordiv(a, b)按位与a & band_(a, b)按位异或a ^ bxor(a, b)按位求反~ ainvert(a)按位求或a | bor_(a, b)求幂a ** bpow(a, b)身份测试a is bis_(a, b)身份测试a is not bis_not(a, b)索引分配obj[k] = vsetitem(obj, k, v)索引删除del obj[k]delitem(obj, k)得出索引键值obj[k]getitem(obj, k)左移a << blshift(a, b)求模a % bmod(a, b)乘法a * bmul(a, b)矩阵乘法a @ bmatmul(a, b)求负值(数学)- aneg(a)求负值(逻辑)not anot_(a)求正值+ apos(a)右移a >> brshift(a, b)片段分配seq[i: j] = valuessetitem(seq, slice(I, j), values)片段删除del seq[i, j]delitem(seq, slice(I, j))得到片段swq[i : j]getitme(seq, slice(i, j))字符串格式化s % objmod(s, obj)减法a - bsub(a, b)真值测试objtruth(obj)排序a < blt(a, b)排序a <= ble(a, b)相等a == beq(a, b)不等a !- bne(a, b)排序a >= bge(a, b)排序a > bge(a, b)

  

   

  

 

 

  

   

    

     

      02

     

     

      原址操作

     

     

      

     

    

   

  

  

   

    

     

     

     

      许多操作都有其原地操作(In-place)版本。以下列出的函数提供了比普通语法操作更原始的原址操作。例如:语句x += y等价于x = operator. iadd(x, y)。其它方法提出说z = operatgor.iadd(x, y)等价于复合语句 z= x; z += y。

      在其他例子中,注意,当一个原址操作被调用,计算和分配在两个分割开来的步骤里进行。原址操作对于“可变对象”和“不可变对象”的操作是不太一样的,对于可变对象,操作之前的对象和操作之后的对象共用内存,但是对于不可变对象,却不是这样的。

      

      对于不变的目标例如字符串、数组和元组,原址运算之后我原来的对象是没变化的:

      

       >>>a ='hello'

>>>iadd(a, ' world')

'helloworld'

>>>a   #还是原来的,没变化

'hello

 

      

      对于可变对象例如列表和字典,原址操作之后,原对象也会更新。

      

       >>>s = ['h', 'e', 'l', 'l', 'o']

>>>iadd(s, [' ', 'w', 'o', 'r', 'l', 'd'])

['h', 'e','l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']

>>>s  #s也更新

['h', 'e','l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']

 

      

      

       operator. iadd(a, b)

operator. __iadd__(a, b)

a = iadd(a, b)等价于a += b。 

 

operator. iand(a, b)

operator. __iand__(a, b)

a = land(a, b)等价于a &= b。

 

operator. iconcat(a, b)

operator. __iconcat__(a, b)

a = iconcat(a, b)等价于a += b,a与b都为序列。

 

operator. ifloordiv(a, b)

operator. __ifloordiv__(a, b)

a = ifloordiv(a, b)等价于 a //= b。

 

operator. ilshift(a, b)

operator. __ilshift__(a, b)

a = ilshift(a, b)等价于a <<= b。

 

operator. imod(a, b)

operator. __imod__(a, b)

a = imud(a, b)等价于a %= b。 

 

operator. imul(a, b)

operator. imul(a, b)

a = imul(a, b)等价于a *= b。

 

operator. imatmul(a, b)

operator. __imatmul__(a, b)

a = imatmul(a, b)等价于a @= b。

 

operator. ior(a, b)

operator. __ior__(a, b)

a = ior(a, b)等价于a |= b。

 

operator. ipow(a, b)

operator. __ipow__(a, b)

a = ipow(a, b)等价于a ** b。

 

operator. irshift(a, b)

operator. __irshift__(a, b)

a = irshift(a, b)等价于a >> b。

 

operator. isub(a, b)

operator. __sub__(a, b)

a = isub(a, b)等价于a -= b。

 

operator. itruediv(a, b)

operator. __itruediv__(a, b)

a = itruediv(a, b)等价于a /= b。

 

operator. ixor(a, b)

operator. __ixor__(a, b)

a = ixor(a, b)等价于a ^= b。

 

      

      上面是一些常见的原址操作运算,带有下划线的版本是为了保持一个兼容性。

     

     

     

    

   

   

    

   

  

  

   

    

     

      03

     

     

      比较运算操作

     

     

    

   

  

  

   

    

     

     

     

      对于所有对象来讲,对象比较函数是十分有用的,并且这些函数以它们支持的丰富的比较操作命名,这个和原生的python运算魔法函数是一致的。

      operator. lt(a, b)          //less than小于

      operator. le(a, b)          //lessthan or equal to小于等于

      operator. eq(a, b)          //equal to等于

      operator. ne(a, b)          //not equalto不等于

      operator. ge(a, b)          //greaterand equal to大于等于

      operator. gt(a, b)          //greater大于

      operator. __le__(a, b)

      operator. __lt__(a, b)

      operator. __eq__(a, b)

      operator. __ne__(a, b)

      operator. __ge__(a, b)

      operator. __gt__(a, b)

      在a与b之间之行丰富的比较操作。特别地,lt(a, b)等价于a < b、le(a, b)等价于a <= b、eq(a, b)等价于a == b、ne(a, b)等价于a != b、gt(a, b)等价于a > b、ge(a, b)等价于a >= b。注意:这些函数可以返回任何值,这个值可能当做布尔值用、也有可能不行。

     

     

     

    

   

   

    

   

  

  

   

    

     

      04

     

     

      逻辑运算操作

     

     

      

     

    

   

   

    

     

      

      

      

       逻辑操作一般也适用于所有对象,并且支持真值比较、定义测试和布尔操作。

       operator. not_(obj)

       operator. __not__(obj)

       返回非obj的结果。(注意:对于对象实例不存在__not__()方法;只有解释器代码定义了这个操作。它的结果受__bool__()和__len__()方法影响)。

       

       operator. truth(obj)

       如果obj是真的,就返回True,否则返回False。等价于使用布尔构造器。

       

       operator. is_(a, b)

       返回表达式a is b,用于测试对象的定义。

       

       operator. is_not(a, b)

       返回表达式a is not b,用于测试对象定义。

       

      

      

      

       

      

     

    

   

   

    

   

  

  

   

    

     

      05

     

     

      数学运算和按位运算

     

     

      

     

    

   

   

    

     

      

      

      

       数学运算和按位运算是最多的:

       

        operator. abs(obj)

operator. __abs__(obj)

 

       

       返回obj的绝对值。

       

        operator. add(a, b)

operator. __add__(a, b)

 

       

       返回a+b,a与b应为数字。

       

        operator. and(a, b)

operator. __and__(a, b)

 

       

       返回a与b的按位与操作结果。

       

        operator. floordiv(a, b)

operator. __floordiv(a, b)

 

       

       返回a//b。(a/b向下取整)

       

        operator. index(a)

operator. __index__(a)

 

       

       将a转换为整数数据并返回。等价于a. __index__()

       

        operator. inv(obj)

operator. invert(obj)

operator. __inv__(obj)

operator. __invert__(obj)

 

       

       对数字obj按位求反,并返回。等价于~obj。

       

        operator. lshift(a, b)

operator. __lshift__(a, b)

 

       

       将a左移b位后返回。

       

        operator. mod(a, b)

operator. __mod__(a, b)

 

       

       返回a%b

       

        operator. mul(a, b)

operator. __mul__(a, b)

 

       

       返回a*b,a与b都为数字。

       

        operator. matmul(a, b)

operator. __matmul__(a, b))

 

       

       返回a@b。

       

        operator. nge(obj)

operator. __neg__(obj)

 

       

       返回obj的负值(-obj)。

       

        operator. or(a, b)

operator. __or__(a, b)

 

       

       a与b按位求或,并返回结果值。

       

        operator. pos(obj)

operator. __pow__(obj)

 

       

       返回obj的正值(+obj)。

       

        operator. pow(a, b)

operator. __pow__(a, b)

 

       

       返回a ** b,a与b都为数字。

       

        operator. rshift(a, b)

operator. __rshift__(a, b)

 

       

       a右移b位,并返回结果值。

       

        operator. sub(a, b)

operator. __sub__(a, b)

 

       

       返回a – b。

       

        operator. truediv(a, b)

operator. __truediv__(a, b)

 

       

       返回a / b,并且类似于2/3是0.66而不是0。它也被称为真除法。

       

        operator. xor(a, b)

operator. __xor__(a, b)

 

       

       a与b按位异或,并返回结果。

       

      

      

      

       

      

     

    

   

   

    

   

  

  

   

    

     

      06

     

     

      序列有关操作

     

     

      

     

    

   

   

    

     

      

      

      

         

       和序列有关的操作(其中的一些也可用于映射),包括:

       

        operator. concat(a, b)

operator. __concat__(a, b)

 

       返回

       a + b,a与b都为序列。

       

        operator. contains(a, b)

operator. __contains__(a, b)

 

       

       返回测试b in a的结果。请注意反转操作数。

       

        operator. countof(a, b)

 

       

       返回b在a中出现的次数。

       

        operator. delitem(a, b)

operator. __delitem__(a, b)

 

       

       删除a索引b的值。

       

        operator. getitem(a, b)

operator. __getitem__(a, b)

 

       

       返回a索引b的值。

       

        operator. indexof(a, b)

 

       

       返回b在a中第一次出现时的索引。

       

        operator. setitem(a, b, c)

operator. __setitem__(a, b, c)

 

       

       a中索引b的位置上的值设置为c。

       

        operator. length_hint(obj, default=0)

 

       

       返回对象obj的估算长度。首先试图返回真实的长度,不行的话使用obj.__length_hint__()估算长度,再不行的话返回默认值规定的长度。

       

      

      

      

       

      

     

    

   

   

    

   

  

  

   

    

     

      07

     

     

      operator高级操作

     

     

      

     

    

   

  

  

   

    

     

     

     

      operator的高级操作

      operator模块也定义了一些广义属性和项目查找的工具。它们常用于为诸如map()、sorted()、itertools. groupby()或其他需要函数作为参数的函数提供参数,该参数为一个高速的字段提取器。

     

     

     

      

     

    

   

  

  

   

  

  

   

    

     

      

       operator

      

      

       7.1 operator. attrgetter(attr)

      

     

     

     

      

     

    

   

   

    

     

      

       

       

       

        返回一个对象的属性,该对象能从其操作中捕获attr。如果提供了多个属性,返回一个属性构成的元组。属性名也可以包含符号点。例如:

        •••运行 f = attrgetter(‘name’)之后,调用f(b),返回b.name。

        •运行 f = attregetter(‘name’,’date’)之后,调用f(b),返回(b. name, b.date)。

        •运行f =attregetter(‘name.first’, ‘name. last’)之后,调用f(b),返回(b. name. first, b. name. last)。

        等价于:

        

         >>> class Student:

...     def __init__(self, name, grade, age):

...         self.name = name

...         self.grade = grade

...         self.age = age

...     def __repr__(self):

...         return repr((self.name, self.grade, self.age))

>>> student_objects = [

...     Student('john', 'A', 15),

...     Student('jane', 'B', 12),

...     Student('dave', 'B', 10),

... ]

>>> sorted(student_objects, key=lambda student: student.age)   # 传统的lambda做法

[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

 

>>> from operator import itemgetter, attrgetter

#注意这个地方的妙用

>>> sorted(student_objects, key=attrgetter('age'))

[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

 

# 但是如果像下面这样接受双重比较,Python脆弱的lambda就不适用了

>>> sorted(student_objects, key=attrgetter('grade', 'age'))

[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]

 

        

        

        总结:顾名思义,attrgetter()得到的是某一个对象的属性或者是好几个属性组成的元组。

        

       

       

       

        

       

      

     

    

   

   

    

   

  

  

   

    

     

      

       operator高级操作

      

      

       7.2 operator. itemgetter(item)

      

     

     

     

      

     

    

   

   

    

     

      

      

      

       返回一个可调用对象,该对象可以使用操作__getitem__()方法从自身的操作中捕获item。如果制定了多个items,返回一个由查询值组成的元组。例如:

       •运行f =itemgetter(2),然后调用f(r),返回r[2]。

       •运行g =itemgetter(2, 5, 3),然后调用g(r),返回(r[2], r[5], r[3])。

       注意:这个地方r是一个可索引的对象,如列表、元组等

       等价于:

       

        defitemgetter(*items):

    if len(items) ==1:

        item = items[0]

        defg(obj):

            return obj[item]

    else:

        defg(obj):

            returntuple(obj[item] for item in items)

    return g

 

       

       Items可以是任何类型,只要该类型可以接受__getitem__()方法的操作(即可以通过“索引”访问值)。比如列表、元组、字符串、或者是自己定义的对象等。列表、元组和字符串接受索引或者片段:

       

        >>>itemgetter(1)('ABCDEFG')

'B'

>>>itemgetter(1,3,5)('ABCDEFG')

('B', 'D','F')

>>>itemgetter(slice(2,None))('ABCDEFG')

'CDEFG'

 

       

       例如使用itemgetter()从元组记录中取回特定的字段:

       

        >>>inventory = [('apple', 3), ('banana', 2), ('pear', 5), ('orange', 1)]

>>>getcount = itemgetter(1)

>>>list(map(getcount, inventory))

[3, 2, 5,1]

>>>sorted(inventory, key=getcount)

[('orange',1), ('banana', 2), ('apple', 3), ('pear', 5)]

 

       

       

      

      

      

       

      

     

    

   

   

    

   

  

  

   

    

     

      

       operator高级操作

      

      

       7.3 operator. methodcaller(name[, args…])

      

     

     

     

      

     

    

   

   

    

     

      

      

      

       返回一个可调用的对象,该对象可以在其操作内调用名为name的方法。如果额外的参数或者关键字参数被给出,它们也会被传递给方法。例如:

       •运行 f = methodcaller(‘name’),调用f(b),返回b. name()。

       •运行 f = methodcaller(‘name’, ‘foo’, bar=1),调用f(b),返回b. name(‘foo’, bar=1)。

       等价于:

       

        defmethodcaller(name, *args, **kwargs):

    defcaller(obj):

        returngetattr(obj, name)(*args, **kwargs)

    return caller

 

       

       

       总结:name相当于是某一个对象的某一个方法;而后面的参数则作为函数的参数使用。

      

      

      

       

      

     

    

   

   

    

     

      

       

        小结

       

      

      

       从上面的例子可以看出,不管是attrgetter(‘attr_name’)还是itemgetter(item)。它们跟sorted、map这些高阶函数结合起来使用,可以发挥出比lambda表达式更加神奇的效果。

      

     

    

   

   

    

    

    

    

     

      

       

        

         我们一起过双旦

         2018.12.30

         Best Wishes to You

         

          最后,再次感谢一路陪伴的小伙伴,希望2018年每个人都能够收获满满,新的2019年都能够赚的盆满锅满!

         

        

       

      

      

       

        

         

          

           猜您喜欢

          

         

        

        

         

          往期精选▼

         

        

        

         1.

         2.

         1. 

         2. 

         3. 

         4. 

         5.

         6.

        

       

      

      

       

        

        

        

         

        

        

        

         

        

       

      

     

    

    

     

      

       

        

         

          

           

            

             

              

               

                

                 

                  

                 关注我们送礼品哦

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐