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()
运算。它们不是高阶函数,而且必须配合匿名函数或已定义的函数使用。