【问题标题】:Understanding nested lambda function behaviour in python了解 Python 中的嵌套 lambda 函数行为
【发布时间】:2016-07-23 08:30:24
【问题描述】:

我正在尝试学习纯函数式编程。但是这段代码让我很困惑,尤其是第二行。我不明白值2 是如何传递给变量x 的。有人可以解释这种嵌套的 lambda 行为吗?

>>> square_func = lambda x: x**2
>>> function_product = lambda F, m: lambda x: F(x)*m
>>> square_func(2)
4
>>> function_product(square_func, 3)(2)
12

【问题讨论】:

    标签: python python-2.7 python-3.x lambda functional-programming


    【解决方案1】:

    当调用外部 lambda 时,内部 lambda 会创建一个函数。外部 lambda 返回此函数。然后使用参数2 调用此函数。

    【讨论】:

    • 能否请您说明一下这些值是如何绑定到变量的?
    【解决方案2】:

    一个好的起点是将type 应用到您的定义中,看看它是否能澄清问题。另外,我不禁要说,如果您对函数式编程感兴趣,那么像 Haskell 之类的东西会是一个更好的起点,即使您不打算使用该语言。话虽如此,这就是你得到的:

    In [13]: type(square_func)
    Out[13]: function
    
    In [14]: type(function_product)
    Out[14]: function
    
    In [15]: type(square_func(2))
    Out[15]: int
    
    In [16]: type(function_product(square_func, 3))
    Out[16]: function
    
    In [17]: type(function_product(square_func, 3)(2))
    Out[17]: int
    

    所以令人费解的部分是function_product(square_func, 3) 的返回类型,它本身就是一个函数,大概是打算接受一个数字并返回一个数字。你可以写成:

    f = function_product(square_func, 3)
    f(2)
    

    【讨论】:

    • 所以,当function_product被调用时,square_func被绑定到F3m,然后返回一个绑定到function_product的函数2x 被分配这个并且square_func被调用,它返回4,然后这个乘以m,即4。所以它最终会返回12。我的理解/解释是否正确?
    【解决方案3】:

    这是一种规则(或约定),如果您遵循样式指南,不要在您使用的上下文中使用lambda。造成这种情况的原因正是让您困惑地转向互联网的原因。标志是:

    1. 您正在为 匿名 函数指定一个名称
    2. 有多个lambda。对于没有嵌套匿名函数的语言,这是一种代码异味。 一定有更好的办法

    以这种方式编写并获得好处怎么样:

    def function_product(F, m):      # returns inner, a function
        def inner(x):                # takes x, and closes over F and m from 
            return F(x)*m            # outer scope, hence a closure
        return inner
    

    看,一切都清楚了,因为它现在更具可读性。避免lambda,可能除了回调,比如sorted()。普通函数是对象,就像 10hello 一样。

    始终使用import this。 :)

    【讨论】:

      【解决方案4】:

      function_product 请求一个函数和一个变量,你传递了square_func 和 3。然后,function_product 的内部函数将你传递的函数的结果 (square_func) 乘以变量你通过了,所以:

      square_func(2)*3 = 12
      

      【讨论】:

        【解决方案5】:

        function_product(square_func, 3) 返回其他可以像这样隐式定义的 Lamba 函数:

        lambda x: square_func(x)*3
        

        接下来通过调用另一个 Lamba 函数,将 2 传递给变量 x

        【讨论】:

          猜你喜欢
          • 2020-03-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-04
          • 1970-01-01
          • 1970-01-01
          • 2010-12-19
          相关资源
          最近更新 更多