了解 Python 中的嵌套 lambda 函数行为

Posted

技术标签:

【中文标题】了解 Python 中的嵌套 lambda 函数行为【英文标题】:Understanding nested lambda function behaviour in python 【发布时间】: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

【问题讨论】:

【参考方案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。造成这种情况的原因正是让您困惑地转向互联网的原因。标志是:

    您正在为 匿名 函数指定一个名称 有多个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

【讨论】:

以上是关于了解 Python 中的嵌套 lambda 函数行为的主要内容,如果未能解决你的问题,请参考以下文章

任何人都可以解释python中的lambda函数吗? [复制]

新手入门,深入解析 python lambda表达式

了解pandas中的lambda函数

如何更新嵌套lambda函数中的变量(C ++)

带有字符串键或嵌套引号的数组到 php 中的 lambda 函数中

使用 lambda 函数在嵌套列表中查找总和