【发布时间】:2012-01-25 16:44:51
【问题描述】:
我有许多可重用的函数,它们都具有相同的签名(它们采用 record 并返回 float)。我经常需要将函数组合成一个新函数。
假设我想创建一个接受record 的函数,将f 应用于它,如果结果为负,则将其转换为零。我有两种方法:组合和功能修改。每种方法的优缺点是什么?
组成:
def non_negative(value):
return max(0, value)
g = compose(non_negative, f)
# from functional module by Collin Winter
def compose(func_1, func_2, unpack=False):
"""
compose(func_1, func_2, unpack=False) -> function
The function returned by compose is a composition of func_1 and func_2.
That is, compose(func_1, func_2)(5) == func_1(func_2(5))
"""
if not callable(func_1):
raise TypeError("First argument to compose must be callable")
if not callable(func_2):
raise TypeError("Second argument to compose must be callable")
if unpack:
def composition(*args, **kwargs):
return func_1(*func_2(*args, **kwargs))
else:
def composition(*args, **kwargs):
return func_1(func_2(*args, **kwargs))
return composition
修改:
def non_negative(func):
def new_func(record):
return max(0, func(record))
return new_func
g = non_negative(f)
【问题讨论】:
-
您所做的是专门针对 non_negative 撰写。
-
@DanD。 Thx .. 我不熟悉函数式编程,所以我没有意识到有一个术语。你能给我介绍一些讨论这个问题的介绍性材料吗?
-
函数特化是函数的一个或多个参数的partial evaluation。它可以使用默认情况下是该术语所暗示的程序来完成,但也可以像您一样手动完成。第二个示例中的代码
non_negative是针对第一个代码示例中的non_negative函数的compose的专用版本。 -
严格来说,您的修改示例不起作用,因为您不返回
new_func,所以g最终成为None。 -
@Ben:糟糕,已修复。 @DanD 我明白了。似乎这种专业化会限制
non-negative的可重用性,因为它仅限于一个签名。
标签: python functional-programming python-3.x function-composition