柯里化 lambda 表达式如何工作?
How does currying lambda expressions work?
我不知道代码是如何执行的。这是一道练习题。
(lambda x: x(x))(lambda y:4)
输出是4,但我不知道代码是如何运行的。我觉得步骤如下:
- lambda (x) 已定义
- 执行 lambda (x)
- returns x(λ(y))
- lambda (y) 已定义
- returns 4
- x(4)?
我知道第 6 步是错误的。
别想"lambda is defined"。 lambda 是一个值,例如 4
。你不 "define" 一个 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) return
参见:
def square(x):
return x**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) 等于 (lambda y: 4)((lambda y: 4))。看!我们的第一个参数 'y' 是 (lambda y: 4)!然后执行第一个函数,然后 returns 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
第二个函数只是一个可调用函数,它 return 是常量值 4,与 y
的值无关,因此 func_2(10)
和 func_2(0)
都 return 4.
第一个函数是一个可调用函数,其自身作为函数的单个参数 (x(x)
)。我们刚刚看到第二个函数是一个可调用函数,无论输入参数如何,它都会 return 常量值 4,所以 func_2(func_2)
只是 returns 4.
我不知道代码是如何执行的。这是一道练习题。
(lambda x: x(x))(lambda y:4)
输出是4,但我不知道代码是如何运行的。我觉得步骤如下:
- lambda (x) 已定义
- 执行 lambda (x)
- returns x(λ(y))
- lambda (y) 已定义
- returns 4
- x(4)?
我知道第 6 步是错误的。
别想"lambda is defined"。 lambda 是一个值,例如 4
。你不 "define" 一个 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) return
参见:
def square(x):
return x**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) 等于 (lambda y: 4)((lambda y: 4))。看!我们的第一个参数 'y' 是 (lambda y: 4)!然后执行第一个函数,然后 returns 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
第二个函数只是一个可调用函数,它 return 是常量值 4,与 y
的值无关,因此 func_2(10)
和 func_2(0)
都 return 4.
第一个函数是一个可调用函数,其自身作为函数的单个参数 (x(x)
)。我们刚刚看到第二个函数是一个可调用函数,无论输入参数如何,它都会 return 常量值 4,所以 func_2(func_2)
只是 returns 4.