Python operator进行归约

Python 使用operator模块函数进行归约,下面再介绍一种使用运算符定义的方法,可以配合内置的functools.reduce()函数一起使用,例如sum()函数定义如下:

sum = functools.partial(functools.reduce, operator.add)

这会根据提供的第一个参数创建一个部分求值的reduce()函数版本。在本例中,该参数是+运算符,并且由operator.add()函数实现。

如果需要一个类似的函数来计算乘积,那么可以如下定义:

prod = functools.partial(functools.reduce, operator.mul)

这里遵循了前面例子中的模式,创建了一个以*运算符作为第一个参数并且进行部分求值的reduce()函数。

尚不清楚能否用其他运算符来实现类似的功能。我们可能会找到operator.concat()函数、operator.and()函数和operator.or()函数的类似实现。

函数and()or()就是按位的&|运算符。如果需要正确使用布尔运算符,那么必须使用all()函数和any()函数代替reduce()函数。

一旦有了prod()函数,便意味着可以定义阶乘,如下所示:

fact = lambda n: 1 if n < 2 else n*prod(range(1, n))

这样做的优点是代码简洁,因为实现了阶乘的单行定义。它还具有不依赖递归的优点,并且避免了因为栈限制而出现的任何问题。

尚不清楚与Python中的许多替代方案相比,这样做是否有任何明显优势。从partial()函数、reduce()函数和operator模块等原语片段构建复杂函数的概念是很美妙的。然而在大多数情况下,operator模块中的简单函数用处不大,而我们总希望使用更复杂的匿名函数。

对于布尔归约,必须使用内置的any()函数和all()函数,它们实现了一种短路的reduce()运算。它们不是高阶函数,而且必须配合匿名函数或已定义的函数使用。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程