返回修改输入函数值的函数

时间:2014-10-06 17:03:12

标签: python scala functional-programming higher-order-functions

如何创建一个函数作为输入并返回一个值为三倍的函数。这是我正在寻找的一些伪代码。 Python或Scala中的具体示例将不胜感激。

def f(int x):
    return x ** 2

def tipleFunc(Function g)
    return 3 * g

Function newFunc = tripleFunc(f)
print newFunc(5)

3 个答案:

答案 0 :(得分:3)

def f(x):
    return x ** 2

def tripleFunc(g):
    return lambda *args: 3 * g(*args)

newFunc = tripleFunc(f)
print newFunc(5)

答案 1 :(得分:2)

在Scala中:

def foo(x: Int) = x * x
def quadruple(f: Int => Int) = (x: Int) => 4 * f(x)
val quadfoo = quadruple(foo)
scala> quadfoo(3)
res0: Int = 36

答案 2 :(得分:0)

您可以使用Python @decorator语法来执行此操作; @decorator等同于分配somefunc = decorator(somefunc),允许应用任意包装函数:

>>> from functools import wraps
>>> def multiplier(n):
    """Create a decorator to multiply a wrapped function's output by n."""
    def wrapper(f):
        @wraps(f) # retain the wrapped function's docstring
        def func(*args, **kwargs):
            return n * f(*args, **kwargs)
        return func
    return wrapper

>>> @multiplier(3) # apply a multiplier of 3 to the outputs of f
def f(x):
    """Return x squared."""
    return x ** 2

>>> f(5)
75

注意*args, **kwargs语法来处理任意参数(分别是位置和关键字)。您也可以直接创建triple_func装饰器,例如:

>>> triple_func = multiplier(3)
>>> @triple_func
def f(x):
    """Return x squared."""
    return x ** 2

>>> f(5)
75

甚至可以在没有装饰器语法的情况下应用它:

>>> def f(x):
    """Return x squared."""
    return x ** 2

>>> new_func = triple_func(f) # or 'new_func = multiplier(3)(f)'
>>> new_func(5)
75