这些嵌套的lambda函数如何工作?

时间:2015-02-01 01:23:52

标签: python function lambda

这段代码有什么作用?什么是适当的n,f和x?

def successor(n):
    return lambda f: lambda x: f(n(f)(x))

1 个答案:

答案 0 :(得分:2)

所以这......代码非常糟糕。你不应该写它,因为你已经找到了(并且评论部分指出),很难说出发生了什么。让我们把它分解。

原始代码如下所示

def successor(n):
    return lambda f: lambda x: f(n(f)(x))

函数successor使用lambda返回anonymous function。这很难读,所以我们用命名函数替换它。

def successor(n):
    def inner_function_one(f):
        return lambda x: f(n(f)(x))
    return inner_function_one

这仍然很难阅读。让我们用命名函数替换另一个匿名函数。

def successor(n):
    def inner_function_one(f):
        def inner_function_two(x):
            return f(n(f)(x))
        return inner_function_two
    return inner_function_one

所以现在我们拆开了这个函数,我们可以看到successor返回一个函数,该函数又返回另一个函数,该函数返回......那个函数。 f(n(f)(x))行很难阅读。它是说使用参数n(f)(x)调用函数f,这是一种表示n(f)返回一个函数然后传递参数x的方式。让我们使用一些更具描述性的变量名来看看这里发生了什么。

def successor(first_function):
    def inner_function_one(second_function):
        def inner_function_two(arg):
            return second_function(first_function(second_function)(arg))
            # Equivalent to something like
            #     return second_function(returned_function(arg))
            # where returned_function is the result of 
            #     first_function(second_function)
        return inner_function_two
    return inner_function_one

至于具体发生在哪里?我不知道。您必须询问编写代码的人。但是,我猜这是打算成为某种类型的装饰者。有一个类似的例子here

def decoratorFunctionWithArguments(arg1, arg2, arg3):
    def wrap(f):
        print "Inside wrap()"
        def wrapped_f(*args):
            print "Inside wrapped_f()"
            print "Decorator arguments:", arg1, arg2, arg3
            f(*args)
            print "After f(*args)"
        return wrapped_f
    return wrap

这允许您使用传递给装饰器的参数在函数的实际装饰器中使用。这是调用以下函数

@decoratorFunctionWithArguments(1, 2, 3)
def my_function():
    print "Inner function"

的输出为

Inside wrap()
Inside wrapped_f()
Decorator arguments: 1 2 3
Inner function
After f(*args)

因此,fnx的适当值为:

f : function
n : function that returns a function when passed a function
x : anything that the result of n being passed f accepts