了解 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
被绑定到F
和3
到m
,然后返回一个绑定到function_product
的函数2
,x
被分配这个并且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()
。普通函数是对象,就像 10
和 hello
一样。
始终使用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函数吗? [复制]