Python 咖喱lambda表达式是如何工作的?
我不知道代码是如何执行的。这是一道练习题Python 咖喱lambda表达式是如何工作的?,python,lambda,currying,Python,Lambda,Currying,我不知道代码是如何执行的。这是一道练习题 (lambda x: x(x))(lambda y:4) 输出是4,但我不知道代码如何运行。我认为步骤如下: 定义了lambda(x) 执行lambda(x) 返回x(λ(y)) 定义了lambda(y) 返回4 x(4) 我知道步骤6是错误的。不要考虑“lambda已定义”。lambda是一个值,如4。你没有“定义”一个4——它只是。计算lambda时,只需将其(已计算的)参数替换到其主体中(必要时添加括号)。像重写问题一样工作 (lambda x:
(lambda x: x(x))(lambda y:4)
输出是4,但我不知道代码如何运行。我认为步骤如下:
4
。你没有“定义”一个4
——它只是。计算lambda时,只需将其(已计算的)参数替换到其主体中(必要时添加括号)。像重写问题一样工作
(lambda x: x(x))(lambda y:4)
# rewrite all `x` in `x(x)` to `lambda y:4` (two appearances):
(lambda y:4)(lambda y:4)
# rewrite all `y` in `4` to `lambda y:4` (zero appearances):
4
lambda
表达式的工作原理与未命名函数(匿名函数)类似。工作原理如下:
lambda (1): (2)
(1) 是参数
(2) 回归
见:
使用lambda表达式:
square = lambda x: x**2
>>> square(2)
4
但是想想它的用途,也许你只想使用一个函数几次,为什么要存储它呢?创建一个匿名函数!怎么用?运行lambda函数:
>>> (lambda x: x**2)(2)
4
看到了吗?没那么难。让我们一起思考
(lambda x: x(x))(lambda y:4)
lambda y:4
被传递给我们的lambda x
函数,现在x=(lambda y:4)(疯狂的事情!)。x(x)等于(λy:4)((λy:4))。看!我们得到了第一个“y”的参数,它是(λy:4)!然后执行第一个函数,并返回4。第二个呢?它不运行,也不需要运行!如果执行x(x(x)),第二个函数将运行,但第三个函数不会运行。这是一个棘手的问题
lambda是匿名函数。让我们定义它们来帮助您了解正在发生的事情
# (lambda x: x(x))
def func_1(func):
return func(func)
# (lambda y: 4)
def func_2(y):
return 4
>>> func_1(func_2) # Equivalent to (lambda x: x(x))(lambda y:4)
4
第二个函数只是一个可调用函数,它返回常量值4,而与y
的值无关,因此func_2(10)
和func_2(0)
都返回4
第一个函数是一个可调用函数,其本身作为函数的单个参数(
x(x)
)。我们刚刚看到第二个函数是一个可调用函数,它将返回常量值4,而不管输入参数是什么,因此func_2(func_2)
只返回4。最左边的lambda是否先运行?如果正确的lambda会成为第一个lambda的输入“x”吗?在python中(以及在许多其他编程语言中,以及它来自的数学中),语法f(x,y,z)
将使用参数x,y,z
计算函数f
。lambda实际上是一个函数。因此,在(lambda x:x)(lambda y:y)
中,lambda x:x
是要评估的函数<代码>λy;y是要传递到函数中的参数(成为本地参数x
)。如果Python有一个奇怪的函数语法,比如(x,y,z)f
,那么它将是相反的。这有意义吗?我想我最感兴趣的是它不会产生错误。说func_2(func_2)生成func_2(4),然后func_2(4)生成4对吗。下面的评论说第二个lambda没有打印,这对我来说没有意义。最左边的lambda运行第一个a返回一个可调用的,该可调用的将一个可调用的作为其唯一参数(人们知道它接受一个可调用的,因为你可以看到它通过x(x)调用自己)
。尝试单独运行它,它将返回类似于
的内容。然后使用第二个lambda callable作为唯一参数调用此函数,不管提供的参数是什么,它只返回4。
# (lambda x: x(x))
def func_1(func):
return func(func)
# (lambda y: 4)
def func_2(y):
return 4
>>> func_1(func_2) # Equivalent to (lambda x: x(x))(lambda y:4)
4