Python进阶之路:operator模块

CodeTalk

发布时间: 18-10-0319:51

Python之父Guido曾经说过,Python不是一门为函数式编程设计的语言。但是得益于Python中强大的工具包,我们可以轻松地实现函数式的编程风格。今天小编想要给大家介绍的就是其中重要的一个模块:operator。

我们先来看一个例子。如果我们现在想要实现一个阶乘的函数,一种比较简洁的方法是使用reduce函数来实现:

非常的简洁优雅是不是。但是还不够完美,因为这里使用了一个lambda匿名函数,用来实现两个变量相乘的功能。其实,operator模块中为我们提供了大量可以用来替代代数操作符的函数来,因此我们可以用operatior.mul来重写上面的函数:

除了代数运算符,operator模块中另两个非常重要的方法是itemgetterattrgetter。这两个函数可以从一个序列或者对象中去获取指定的元素或属性值。我们再来看一个例子,将一个元组列表按元组中的值排序。为此,我们使用itemgetter(1)来生成一个函数去获取元组中的第一个值,其效果等同于lambda函数lambda fields: fields[1]。

如果我们向itemgetter传递多个索引参数,那么其返回的函数获取的将是由对应索引值所组成的元组。

我们再来看attrgetter函数,它的功能是生成一个函数,该函数将根据输入的字符串属性名返回一个对象的属性值。如果输入多个属性名,则返回由多个属性值组成的元组。另外,属性名可以是由“.”分隔的嵌套格式。我们来看下面这个例子:

在这个例子中,我们可以看到attrgetter生成了name_lat函数,并用它获取Metropolis的属性值。

除了上面介绍的几个函数外,我们可以通过dir()来看一下operator模块中包含的其它函数

它们的功能大部分都比较容易理解。需要注意的是,其中以字母i开头的函数,如iadd,iand,它们的功能相当于+=,&=等自运算符。如果这些函数的第一个参数是可变的,就会将运算结果赋值给第一个参数。如果第一个参数是不可变的,那么它们的效果和不带i的版本一样,将运算结果返回。

作为最后一个例子,我们来介绍一下methodcaller函数。这个函数与itemgetter和attrgetter类似,也会返回一个函数,这个函数的作用是调用一个对象的方法。方法名和参数在methodcaller的调用参数中指定,而作用的对象则在被生成函数的参数中指定。

在上面的例子中,首先我们通过methodcaller得到一个函数upcase,该函数将调用被作用对象的upper方法。然后我们将一个字符串传递给upcase函数,就相当于调用了这个字符串的upper方法了。

总结一下,operator模块为我们提供了非常丰富的工具函数,可以帮助我们写出简洁易懂的函数是编程风格的代码。

举报/反馈